sync_workflow_design_admin.mjs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import fs from 'fs'
  2. import path from 'path'
  3. import { fileURLToPath } from 'url'
  4. const __dirname = path.dirname(fileURLToPath(import.meta.url))
  5. const root = path.resolve(__dirname, '../..')
  6. const srcVue = path.join(root, 'saas-companyui/src/views/company/companyWorkflow/design.vue')
  7. const dstVue = path.join(root, 'saas-mgnui/src/views/company/companyWorkflow/design.vue')
  8. const srcScss = path.join(root, 'saas-companyui/src/views/company/companyWorkflow/design.scss')
  9. const dstScss = path.join(root, 'saas-mgnui/src/views/company/companyWorkflow/design.scss')
  10. let vue = fs.readFileSync(srcVue, 'utf8')
  11. fs.copyFileSync(srcScss, dstScss)
  12. // toolbar: company + sales selectors
  13. vue = vue.replace(
  14. ` <el-select v-model="form.workflowType" placeholder="类型" size="small" style="width: 120px; margin-left: 10px">
  15. <el-option
  16. v-for="dict in workflowTypeOptions"
  17. :key="dict.dictValue"
  18. :label="dict.dictLabel"
  19. :value="dict.dictValue"
  20. />
  21. </el-select>
  22. </div>`,
  23. ` <el-select v-model="form.workflowType" placeholder="类型" size="small" style="width: 120px; margin-left: 10px">
  24. <el-option
  25. v-for="dict in workflowTypeOptions"
  26. :key="dict.dictValue"
  27. :label="dict.dictLabel"
  28. :value="dict.dictValue"
  29. />
  30. </el-select>
  31. <el-select
  32. v-if="!readonlyMode"
  33. v-model="formCompanyId"
  34. placeholder="选择公司"
  35. size="small"
  36. style="width: 160px; margin-left: 10px"
  37. filterable
  38. :disabled="!!workflowId"
  39. @change="onDesignCompanyChange"
  40. >
  41. <el-option
  42. v-for="item in companys"
  43. :key="item.companyId"
  44. :label="item.companyName"
  45. :value="item.companyId"
  46. />
  47. </el-select>
  48. <el-select
  49. v-if="!readonlyMode && !workflowId"
  50. v-model="formCompanyUserId"
  51. placeholder="销售人员"
  52. size="small"
  53. style="width: 140px; margin-left: 10px"
  54. filterable
  55. clearable
  56. :disabled="!formCompanyId"
  57. >
  58. <el-option
  59. v-for="item in formSalesUserOptions"
  60. :key="item.userId"
  61. :label="item.nickName || item.userName"
  62. :value="item.userId"
  63. />
  64. </el-select>
  65. </div>`
  66. )
  67. // imports + mixin
  68. vue = vue.replace(
  69. `import { listAll } from '@/api/company/wxDialog';
  70. export default {
  71. name: 'WorkflowDesign',`,
  72. `import { listAll } from '@/api/company/wxDialog'
  73. import companyScopeMixin from '@/views/company/mixins/companyScopeMixin'
  74. import { getUserList } from '@/api/company/companyUser'
  75. export default {
  76. name: 'WorkflowDesign',
  77. mixins: [companyScopeMixin],`
  78. )
  79. // data fields
  80. vue = vue.replace(
  81. ` // 工作流ID
  82. workflowId: null,
  83. // 历史版本ID`,
  84. ` // 工作流ID
  85. workflowId: null,
  86. // 总后台:绑定公司与销售人员
  87. formCompanyId: null,
  88. formCompanyUserId: null,
  89. formSalesUserOptions: [],
  90. // 历史版本ID`
  91. )
  92. // created: route companyId + scoped options
  93. vue = vue.replace(
  94. ` created() {
  95. this.workflowId = this.$route.params.id
  96. this.versionId = this.$route.params.versionId`,
  97. ` created() {
  98. this.workflowId = this.$route.params.id
  99. this.versionId = this.$route.params.versionId
  100. const routeCompanyId = this.$route.query.companyId
  101. if (routeCompanyId) {
  102. this.formCompanyId = Number(routeCompanyId)
  103. }`
  104. )
  105. vue = vue.replace(
  106. ` listAll().then(e => {
  107. this.wxDialogList = e.data;
  108. console.log("------")
  109. console.log(this.wxDialogList)
  110. })`,
  111. ` this.loadWxDialogList()
  112. if (this.formCompanyId) {
  113. this.onDesignCompanyChange(this.formCompanyId)
  114. }`
  115. )
  116. vue = vue.replace(
  117. ` // 预加载转人工分机列表(用于保存时ID→完整信息映射)
  118. getExtensionList().then(res => {
  119. this.easyCallExtensionList = (res.data || []).map(item => ({
  120. ...item,
  121. _label: item.companyUserName ? \`\${item.extensionNum}-\${item.companyUserName}\` : item.extensionNum
  122. }))
  123. })`,
  124. ` // 预加载转人工分机列表(用于保存时ID→完整信息映射)
  125. this.loadExtensionList()`
  126. )
  127. // selectNode easyCall + sms with companyId
  128. vue = vue.replace(/getGatewayList\(\)/g, 'getGatewayList(this.resolveDesignCompanyParams())')
  129. vue = vue.replace(/getLlmAccountList\(\)/g, 'getLlmAccountList(this.resolveDesignCompanyParams())')
  130. vue = vue.replace(/getVoiceCodeList\(\)/g, 'getVoiceCodeList(this.resolveDesignCompanyParams())')
  131. vue = vue.replace(/getBusiGroupList\(\)/g, 'getBusiGroupList(this.resolveDesignCompanyParams())')
  132. vue = vue.replace(
  133. ` // 刷新分机列表(预加载已在created完成,此处刷新最新数据)
  134. getExtensionList(this.resolveDesignCompanyParams()).then(res => {
  135. this.easyCallExtensionList = (res.data || []).map(item => ({
  136. ...item,
  137. _label: item.companyUserName ? \`\${item.extensionNum}-\${item.companyUserName}\` : item.extensionNum
  138. }))
  139. })`,
  140. ` this.loadExtensionList()`
  141. )
  142. vue = vue.replace(
  143. ` getSmsTempList().then(res => {
  144. this.smsTempList = res.data || []
  145. })`,
  146. ` getSmsTempList(this.resolveDesignCompanyParams()).then(res => {
  147. this.smsTempList = res.data || []
  148. })`
  149. )
  150. // loadWorkflow: set company from data
  151. vue = vue.replace(
  152. ` loadWorkflow() {
  153. getWorkflow(this.workflowId).then(res => {
  154. const data = res.data
  155. this.form = {`,
  156. ` loadWorkflow() {
  157. getWorkflow(this.workflowId).then(res => {
  158. const data = res.data
  159. if (data.companyId) {
  160. this.formCompanyId = data.companyId
  161. this.onDesignCompanyChange(data.companyId)
  162. }
  163. if (data.companyUserId) {
  164. this.formCompanyUserId = data.companyUserId
  165. }
  166. this.form = {`
  167. )
  168. // handleSave: validate + company fields
  169. vue = vue.replace(
  170. ` if (!this.form.workflowName) {
  171. this.$message.warning('请输入工作流名称')
  172. return
  173. }
  174. if (!this.form.workflowName) {
  175. this.$message.warning('请输入工作流名称')
  176. return
  177. }`,
  178. ` if (!this.form.workflowName) {
  179. this.$message.warning('请输入工作流名称')
  180. return
  181. }
  182. if (!this.formCompanyId) {
  183. this.$message.warning('请选择公司')
  184. return
  185. }
  186. if (!this.workflowId && !this.formCompanyUserId) {
  187. this.$message.warning('请选择销售人员')
  188. return
  189. }`
  190. )
  191. vue = vue.replace(
  192. ` startNodeKey: startNodes[0].nodeKey,
  193. endNodeKey: endNodes[0].nodeKey
  194. }`,
  195. ` startNodeKey: startNodes[0].nodeKey,
  196. endNodeKey: endNodes[0].nodeKey,
  197. companyId: this.formCompanyId,
  198. companyUserId: this.formCompanyUserId
  199. }`
  200. )
  201. vue = vue.replace(
  202. ` this.$router.replace('/companyWx/companyWorkflow/design/' + this.workflowId)`,
  203. ` this.$router.replace({
  204. path: '/companyWx/companyWorkflow/design/' + this.workflowId,
  205. query: { companyId: this.formCompanyId }
  206. })`
  207. )
  208. // admin helper methods
  209. const adminMethods = `
  210. resolveDesignCompanyParams() {
  211. return this.formCompanyId ? { companyId: this.formCompanyId } : {}
  212. },
  213. onDesignCompanyChange(companyId) {
  214. this.formCompanyUserId = null
  215. this.loadDesignSalesUsers(companyId)
  216. this.loadWxDialogList()
  217. this.loadExtensionList()
  218. },
  219. loadDesignSalesUsers(companyId) {
  220. if (!companyId) {
  221. this.formSalesUserOptions = []
  222. return
  223. }
  224. getUserList(companyId).then(res => {
  225. this.formSalesUserOptions = res.data || []
  226. })
  227. },
  228. loadWxDialogList() {
  229. const params = this.resolveDesignCompanyParams()
  230. if (!params.companyId) {
  231. this.wxDialogList = []
  232. return
  233. }
  234. listAll(params).then(e => {
  235. this.wxDialogList = e.data || []
  236. })
  237. },
  238. loadExtensionList() {
  239. const params = this.resolveDesignCompanyParams()
  240. if (!params.companyId) {
  241. this.easyCallExtensionList = []
  242. return
  243. }
  244. getExtensionList(params).then(res => {
  245. this.easyCallExtensionList = (res.data || []).map(item => ({
  246. ...item,
  247. _label: item.companyUserName ? \`\${item.extensionNum}-\${item.companyUserName}\` : item.extensionNum
  248. }))
  249. })
  250. },`
  251. vue = vue.replace(
  252. ` methods: {
  253. // 聚焦画布容器
  254. focusCanvasContainer() {`,
  255. ` methods: {${adminMethods}
  256. // 聚焦画布容器
  257. focusCanvasContainer() {`
  258. )
  259. fs.writeFileSync(dstVue, vue, 'utf8')
  260. console.log('Synced design.vue and design.scss to saas-mgnui')