Parcourir la source

Merge branch 'dev' of http://39.101.143.165:8090/dong_k/link-wechat-web-pc

baijunde il y a 8 mois
Parent
commit
c6930eea32
58 fichiers modifiés avec 4391 ajouts et 698 suppressions
  1. 3 4
      env.js
  2. 6 6
      src/api/carHfAllot/index.js
  3. 3 3
      src/api/carHfInfo/index.js
  4. 9 9
      src/api/carHfManage/index.js
  5. 14 14
      src/api/carRenewal/index.js
  6. 13 13
      src/api/carRenewalGenjinQuery/index.js
  7. 3 3
      src/api/carRenewalLaw/index.js
  8. 3 3
      src/api/carRenewalLawCar/index.js
  9. 20 20
      src/api/carRenewalLawQuery/index.js
  10. 1 1
      src/api/common.js
  11. 2 2
      src/api/customer/index.js
  12. 37 0
      src/api/customerManage/smartTagging.js
  13. 28 0
      src/api/customerManage/userActionTypeConfig.js
  14. 38 0
      src/api/customerManage/userSync.js
  15. 44 0
      src/api/customerManage/wechatCustomer.js
  16. 97 0
      src/api/lottery/index.js
  17. 9 9
      src/api/nocarRenewalFramenAllot/index.js
  18. 12 12
      src/api/nocarRenewalGenjinQuery/index.js
  19. 11 11
      src/api/nocarRenewalLawQuery/index.js
  20. 4 4
      src/api/organization.js
  21. 12 12
      src/api/otherCarXbAllot/index.js
  22. 2 2
      src/api/otherCarXbImport/index.js
  23. 3 3
      src/api/otherCarXbInfo/index.js
  24. 2 2
      src/api/otherCarXbManage/infoMsg.js
  25. 13 13
      src/api/renewalCount/index.js
  26. 3 3
      src/api/renewalCount/xbrwzztj.js
  27. 9 9
      src/api/renewalFc/index.js
  28. 9 9
      src/api/renewalFramenAllot/index.js
  29. 73 0
      src/api/sop/customerOperationsSop.js
  30. 36 0
      src/components/UploadToCos.vue
  31. 638 0
      src/components/templateTable.vue
  32. 12 3
      src/directive/index.js
  33. 14 6
      src/directive/permission/hasPermi.js
  34. 16 8
      src/directive/permission/hasRole.js
  35. 140 1
      src/styles/index.scss
  36. 146 0
      src/views/application/form/add.vue
  37. 223 0
      src/views/application/form/list.vue
  38. 220 41
      src/views/application/lottery/add.vue
  39. 140 22
      src/views/application/lottery/list.vue
  40. 156 0
      src/views/application/packet/add.vue
  41. 243 0
      src/views/application/packet/list.vue
  42. 6 7
      src/views/carHfAllot/infoMsg/groupDetail.vue
  43. 6 7
      src/views/carHfInfo/infoMsg/groupDetail.vue
  44. 7 8
      src/views/carHfManage/infoMsg/groupDetail.vue
  45. 111 143
      src/views/commodityCenter/commodityManage/detail.vue
  46. 140 276
      src/views/commodityCenter/commodityManage/list.vue
  47. 1 1
      src/views/communityOperating/keywords/list.vue
  48. 10 2
      src/views/customerManage/customer.vue
  49. 85 0
      src/views/customerManage/userSync/detail.vue
  50. 227 0
      src/views/customerManage/userSync/list.vue
  51. 81 0
      src/views/customerManage/wechatCustomer/detail.vue
  52. 210 0
      src/views/customerManage/wechatCustomer/list.vue
  53. 331 0
      src/views/customerOperation/smartTagging.vue
  54. 174 0
      src/views/customerOperation/userActionTypeConfig.vue
  55. 31 0
      src/views/customerOperations/sop/detail.vue
  56. 498 0
      src/views/customerOperations/sop/list.vue
  57. 5 5
      src/views/enterpriseManage/contacts/organization.vue
  58. 1 1
      src/views/system/menu/index.vue

+ 3 - 4
env.js

@@ -13,7 +13,7 @@ const envs = {
     _ISGZIP: true, // 是否开启gzip压缩
     _ISCDN: true, // 是否开启cdn加速
   },
-   test: {
+  test: {
     DOMAIN: 'http://10.1.37.249:6180',
     BASE_URL: './', // 路由基础路径
     BASE_API: 'http://10.1.37.249:6180',
@@ -34,9 +34,8 @@ const envs = {
     _ISCDN: true, // 是否开启cdn加速
   },
   development: {
-    // DOMAIN: 'http://10.1.4.199:6180',
-    // DOMAIN: 'http://10.1.37.249:6180',
-    DOMAIN: 'https://scrm-gw.chinacoal-ins.com',
+    DOMAIN: 'http://192.168.0.106:6180',//董鑫
+    // DOMAIN: 'https://scrm-gw.baoxianzhanggui.com',//屈晨
     BASE_URL: './', // 路由基础路径
     BASE_API: 'https://scrm-gw.chinacoal-ins.com',
     // BASE_API: 'http://10.1.37.249:6180',

+ 6 - 6
src/api/carHfAllot/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/carHfList/genjinList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/carHfList/genjinList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -29,7 +29,7 @@ export function getList(params) {
 //导出
 export function exportGenjinList(data) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfList/exportGenjinList',
+    url: service + '/chinacoal/carHfList/exportGenjinList',
     method: 'post',
     data: data,
     responseType: 'blob'
@@ -39,7 +39,7 @@ export function exportGenjinList(data) {
 //任务管理,查询分配人员
 export function listByDeptId(params) {
   return request({
-    url: service + '/linkwe-chinacoal/sysuser/hfListByDeptIdChild',
+    url: service + '/chinacoal/sysuser/hfListByDeptIdChild',
     method: 'get',
     params
   })
@@ -47,8 +47,8 @@ export function listByDeptId(params) {
 //任务管理,查询分配人员
 export function renewalAllot(params) {
   return request({
-    url: service + '/linkwe-chinacoal/linkwe-chinacoal/carHfList/renewalTurnover',
+    url: service + '/chinacoal/chinacoal/carHfList/renewalTurnover',
     method: 'post',
     data:params
   })
-}
+}

+ 3 - 3
src/api/carHfInfo/index.js

@@ -6,16 +6,16 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
 }
 
-    
+
 export function getList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfMsg/hfmsgList',
+    url: service + '/chinacoal/carHfMsg/hfmsgList',
     method: 'post',
     data:params
   })

+ 9 - 9
src/api/carHfManage/index.js

@@ -5,7 +5,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -13,7 +13,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/carHfList/queryList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/carHfList/queryList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data: params
   })
@@ -24,7 +24,7 @@ export function getList(params) {
 
 export function exportList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfList/exportList',
+    url: service + '/chinacoal/carHfList/exportList',
     method: 'post',
     data: params,
     responseType: 'blob'
@@ -35,7 +35,7 @@ export function exportList(params) {
 // 回访记录
 export function getHfList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/carHfMsg/selectHf?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/carHfMsg/selectHf?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data: params
   })
@@ -44,7 +44,7 @@ export function getHfList(params) {
 // 新增编辑 回访
 export function addEditHf(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfMsg/saveOrUpdateHf',
+    url: service + '/chinacoal/carHfMsg/saveOrUpdateHf',
     method: 'post',
     data: params
   })
@@ -52,14 +52,14 @@ export function addEditHf(params) {
 // s删除
 export function deleteRow(keyid) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfMsg/deleteByKeyId/'+keyid,
+    url: service + '/chinacoal/carHfMsg/deleteByKeyId/'+keyid,
     method: 'get',
-     
+
   })
 }
 export function hfListByDeptId(params) {
   return request({
-    url: service + '/linkwe-chinacoal/sysuser/hfListByDeptId',
+    url: service + '/chinacoal/sysuser/hfListByDeptId',
     method: 'get',
     params
   })
@@ -68,7 +68,7 @@ export function hfListByDeptId(params) {
 
 export function renewalAllot(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carHfList/renewalAllot',
+    url: service + '/chinacoal/carHfList/renewalAllot',
     method: 'post',
     data:params
   })

+ 14 - 14
src/api/carRenewal/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewal/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewal/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -25,7 +25,7 @@ export function getList(params) {
 // 导出功能
 export function carQueryRenwalListExport(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewal/carQueryRenwalListExport',
+    url: service + '/chinacoal/renewal/carQueryRenwalListExport',
     method: 'post',
     responseType: "blob",
     data: params
@@ -35,7 +35,7 @@ export function carQueryRenwalListExport(params) {
 
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewal/selectGenjin',
+    url: service + '/chinacoal/renewal/selectGenjin',
     method: 'get',
     params
   })
@@ -44,13 +44,13 @@ export function getGjjl(params) {
 
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewal/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/renewal/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewal/saveOrUpdateGenjin `,
+    url: service + `/chinacoal/renewal/saveOrUpdateGenjin `,
     method: 'post',
     data:params
   })
@@ -59,7 +59,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -67,7 +67,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewal/selectBjjl',
+    url: service + '/chinacoal/renewal/selectBjjl',
     method: 'get',
     params
   })
@@ -76,7 +76,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewal/selectHisInsure',
+    url: service + '/chinacoal/renewal/selectHisInsure',
     method: 'get',
     params
   })
@@ -85,7 +85,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewal/qwHisClaimDto',
+    url: service + '/chinacoal/renewal/qwHisClaimDto',
     method: 'get',
     params
   })
@@ -94,7 +94,7 @@ export function qwHisClaimDto(params) {
 // 通话记录查询
 export function selectThjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/uccRms/select?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/uccRms/select?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
   })
@@ -103,7 +103,7 @@ export function selectThjl(params) {
 // 通话记录导出
 export function selectExport(params) {
   return request({
-    url: service + `/linkwe-chinacoal/uccRms/selectExport`,
+    url: service + `/chinacoal/uccRms/selectExport`,
     method: 'post',
     responseType: "blob",
     data:params
@@ -112,7 +112,7 @@ export function selectExport(params) {
 // 通话记录统计
 export function uccCount(params) {
   return request({
-    url: service + `/linkwe-chinacoal/uccRms/uccCount`,
+    url: service + `/chinacoal/uccRms/uccCount`,
     method: 'get',
     params
   })
@@ -121,7 +121,7 @@ export function uccCount(params) {
 // 通话记录统计导出
 export function uccCountExport(params) {
   return request({
-    url: service + `/linkwe-chinacoal/uccRms/uccCountExport`,
+    url: service + `/chinacoal/uccRms/uccCountExport`,
     method: 'get',
     responseType: "blob",
     params

+ 13 - 13
src/api/carRenewalGenjinQuery/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/carQueryRenwalList',
+    url: service + '/chinacoal/carRenewalGenjin/carQueryRenwalList',
     method: 'get',
     params
   })
@@ -24,20 +24,20 @@ export function getList(params) {
 
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectGenjin',
+    url: service + '/chinacoal/carRenewalGenjin/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/carRenewalGenjin/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/carRenewalGenjin/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/saveOrUpdateGenjin`,
+    url: service + `/chinacoal/renewalFramenoList/saveOrUpdateGenjin`,
     method: 'post',
     data:params
   })
@@ -46,7 +46,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -54,7 +54,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectBjjl',
+    url: service + '/chinacoal/carRenewalGenjin/selectBjjl',
     method: 'get',
     params
   })
@@ -63,7 +63,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectHisInsure',
+    url: service + '/chinacoal/carRenewalGenjin/selectHisInsure',
     method: 'get',
     params
   })
@@ -72,7 +72,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/qwHisClaimDto',
+    url: service + '/chinacoal/carRenewalGenjin/qwHisClaimDto',
     method: 'get',
     params
   })
@@ -83,7 +83,7 @@ export function qwHisClaimDto(params) {
 //机构查询
 export function selectUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/selectUserDept',
+    url: service + '/chinacoal/userDept/selectUserDept',
     method: 'get',
     params
   })
@@ -92,7 +92,7 @@ export function selectUserDept(params) {
 //机构配置
 export function addUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/addUserDept',
+    url: service + '/chinacoal/userDept/addUserDept',
     method: 'post',
     data:params
   })
@@ -105,9 +105,9 @@ export function addUserDept(params) {
  */
 export function exportGenjinList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/carQueryRenwalListExport',
+    url: service + '/chinacoal/carRenewalGenjin/carQueryRenwalListExport',
     method: 'get',
     params,
     responseType: 'blob'
   })
-}
+}

+ 3 - 3
src/api/carRenewalLaw/index.js

@@ -2,7 +2,7 @@ import request from '@/utils/request'
 const service = window.lwConfig.services.system
 export function getList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalLaw/selectLaw',
+    url: service + '/chinacoal/renewalLaw/selectLaw',
     method: 'get',
     params
   })
@@ -10,14 +10,14 @@ export function getList(params) {
 
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalLaw/delByLawId/${id}`,
+    url: service + `/chinacoal/renewalLaw/delByLawId/${id}`,
     method: 'get',
   })
 }
 
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalLaw/saveOrUpdateLaw`,
+    url: service + `/chinacoal/renewalLaw/saveOrUpdateLaw`,
     method: 'post',
     data:params
   })

+ 3 - 3
src/api/carRenewalLawCar/index.js

@@ -2,7 +2,7 @@ import request from '@/utils/request'
 const service = window.lwConfig.services.system
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalLawN/selectLawN?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewalLawN/selectLawN?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
   })
@@ -10,14 +10,14 @@ export function getList(params) {
 
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalLaw/delByLawId/${id}`,
+    url: service + `/chinacoal/renewalLaw/delByLawId/${id}`,
     method: 'get',
   })
 }
 
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalLawN/saveOrUpdateLawN`,
+    url: service + `/chinacoal/renewalLawN/saveOrUpdateLawN`,
     method: 'post',
     data:params
   })

+ 20 - 20
src/api/carRenewalLawQuery/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewalFramenoList/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -25,20 +25,20 @@ export function getList(params) {
 
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectGenjin',
+    url: service + '/chinacoal/renewalFramenoList/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/saveOrUpdateGenjin `,
+    url: service + `/chinacoal/renewalFramenoList/saveOrUpdateGenjin `,
     method: 'post',
     data:params
   })
@@ -47,7 +47,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -55,7 +55,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectBjjl',
+    url: service + '/chinacoal/renewalFramenoList/selectBjjl',
     method: 'get',
     params
   })
@@ -64,7 +64,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectHisInsure',
+    url: service + '/chinacoal/renewalFramenoList/selectHisInsure',
     method: 'get',
     params
   })
@@ -73,7 +73,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/qwHisClaimDto',
+    url: service + '/chinacoal/renewalFramenoList/qwHisClaimDto',
     method: 'get',
     params
   })
@@ -84,7 +84,7 @@ export function qwHisClaimDto(params) {
 //机构查询
 export function selectUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/selectUserDept',
+    url: service + '/chinacoal/userDept/selectUserDept',
     method: 'get',
     params
   })
@@ -93,7 +93,7 @@ export function selectUserDept(params) {
 //机构配置
 export function addUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/addUserDept',
+    url: service + '/chinacoal/userDept/addUserDept',
     method: 'post',
     data:params
   })
@@ -104,7 +104,7 @@ export function addUserDept(params) {
 //任务管理,查询分配人员
 export function listByDeptId(params) {
   return request({
-    url: service + '/linkwe-chinacoal/sysuser/listByDeptId',
+    url: service + '/chinacoal/sysuser/listByDeptId',
     method: 'get',
     params
   })
@@ -113,7 +113,7 @@ export function listByDeptId(params) {
 //任务管理,查询分配人员
 export function renewalAllot(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/renewalAllot',
+    url: service + '/chinacoal/renewalFramenoList/renewalAllot',
     method: 'post',
     data:params
   })
@@ -122,7 +122,7 @@ export function renewalAllot(params) {
 //一件续保
 export function oneRenewal(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/oneRenewal ',
+    url: service + '/chinacoal/renewalFramenAllot/oneRenewal ',
     method: 'post',
     data:params
   })
@@ -133,7 +133,7 @@ export function oneRenewal(params) {
 //发送短信接口
 export function urllink(params) {
   return request({
-    url: service + '/linkwe-chinacoal/wx/urllink',
+    url: service + '/chinacoal/wx/urllink',
     method: 'get',
     params
   })
@@ -142,7 +142,7 @@ export function urllink(params) {
 // 任务管理,导出
 export function carQueryRenwalListExport(data) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/carQueryRenwalListExport',
+    url: service + '/chinacoal/renewalFramenoList/carQueryRenwalListExport',
     method: 'post',
     responseType: "blob",
     data
@@ -153,7 +153,7 @@ export function carQueryRenwalListExport(data) {
 //软电话查询分机号跟工号
 export function queryPhone(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/queryPhone',
+    url: service + '/chinacoal/renewalFramenAllot/queryPhone',
     method: 'get',
     params
   })
@@ -162,7 +162,7 @@ export function queryPhone(params) {
 //拨打电话时新增外呼日志记录
 export function saveSysUserPhoneLog(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/saveSysUserPhoneLog',
+    url: service + '/chinacoal/renewalFramenAllot/saveSysUserPhoneLog',
     method: 'post',
     data:params
   })
@@ -173,7 +173,7 @@ export function saveSysUserPhoneLog(params) {
 //挂断电话接口
 export function endPhone(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/endPhone',
+    url: service + '/chinacoal/renewalFramenAllot/endPhone',
     method: 'post',
     data:params
   })
@@ -182,7 +182,7 @@ export function endPhone(params) {
 // 任务下发轨迹查询接口
 export function allotTurnover(data) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/allotTurnover',
+    url: service + '/chinacoal/renewalFramenoList/allotTurnover',
     method: 'post',
     data
   })

+ 1 - 1
src/api/common.js

@@ -123,7 +123,7 @@ export function getWechatUserInfo() {
  */
 export function showPhone(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/showPhone',
+    url: service + '/chinacoal/renewalFramenAllot/showPhone',
     method: 'get',
     params
   })

+ 2 - 2
src/api/customer/index.js

@@ -188,7 +188,7 @@ export function getDetail(params) {
 
 export function setWecustomerlnfo(params) {
   return request({
-    url: service1 + '/linkwe-chinacoal/renewalFramenoList/setWecustomerlnfo',
+    url: service1 + '/chinacoal/renewalFramenoList/setWecustomerlnfo',
     method: 'get',
     params
   })
@@ -229,7 +229,7 @@ export function getCustomerInfoByUserId(data) {
 //查询客户保单
 export function selectPolicyno(data) {
   return request({
-    url: '/linkwe-chinacoal/renewalFramenoList/selectPolicyno',
+    url: '/chinacoal/renewalFramenoList/selectPolicyno',
     params: data
   })
 }

+ 37 - 0
src/api/customerManage/smartTagging.js

@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.wecom
+//智能打标
+//  获取标签组
+export function tagList(params) {
+  return request({
+    url: service+'/tag/list',
+    method: 'get',
+    params
+  })
+}
+
+// 打标规则添加
+export function markAdd(data) {
+  return request({
+    url: service+'/mark/add',
+    method: 'post',
+    data
+  })
+}
+
+// 打标规则列表
+export function markList(params) {
+  return request({
+    url: service + '/mark/list',
+    method: 'get',
+    params
+  })
+}
+//规则查看
+export function markQueryById(params) {
+  return request({
+    url: service + '/mark/queryById',
+    method: 'get',
+    params
+  })
+}

+ 28 - 0
src/api/customerManage/userActionTypeConfig.js

@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.wecom
+//用户同步
+//  行为类型添加
+export function behaviorAdd(data) {
+  return request({
+    url: service+'/behavior/type/add',
+    method: 'post',
+    data
+  })
+}
+
+// 分页列表
+export function behaviorList(params) {
+  return request({
+    url: service+'/behavior/type/list',
+    method: 'get',
+    params
+  })
+}
+
+// 启用/禁用
+export function behaviorDisableEnable(id) {
+  return request({
+    url: service + '/behavior/type/disableEnable?id='+id,
+    method: 'get'
+  })
+}

+ 38 - 0
src/api/customerManage/userSync.js

@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.wecom
+const local = window.lwConfig.services.system
+//用户同步
+//  查询同步用户列表(分页)
+export function userFindWeUserList(params) {
+  return request({
+    url: service+'/we/user/findWeUserList',
+    method: 'get',
+    params
+  })
+}
+
+// 查看详情接口
+export function findWeUserBaseInfo(params) {
+  return request({
+    url: service+'/we/user/findWeUserBaseInfo',
+    method: 'get',
+    params
+  })
+}
+
+// 用户分配/转移
+export function userTransferOwner(id, data) {
+  return request({
+    url: service + '/we/user/transferOwner/'+id + '?userId=' + data,
+    method: 'post',
+  })
+}
+
+// 分配/转出可选的用户
+export function userList(params) {
+  return request({
+    url: local + `/system/user/listAll`,
+    method: 'get',
+  })
+}
+

+ 44 - 0
src/api/customerManage/wechatCustomer.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.wecom
+const local = window.lwConfig.services.system
+//微信客户
+// 查询微信客户列表(分页)
+export function findWeCustomerUserList(params) {
+  return request({
+    url: service+'/we/customerUser/findWeCustomerUserList',
+    method: 'get',
+    params
+  })
+}
+
+// 查看微信客户详情接口
+export function findWeCustomerUserBaseInfo(params) {
+  return request({
+    url: service+'/we/customerUser/findWeCustomerUserBaseInfo',
+    method: 'get',
+    params
+  })
+}
+
+// 绑定用户
+export function customerBindUser(id, data) {
+  return request({
+    url: service + '/we/customerUser/bindUser/'+id + '?userId=' + data,
+    method: 'post'
+  })
+}
+// 解绑用户
+export function customerUnbindUser(id) {
+  return request({
+    url: service + '/we/customerUser/unbindUser/'+id,
+    method: 'post'
+  })
+}
+// 绑定用户可选的数据
+export function userList() {
+  return request({
+    url: service + '/we/user/findUserList ',
+    method: 'get',
+  })
+}
+

+ 97 - 0
src/api/lottery/index.js

@@ -0,0 +1,97 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.system + window.lwConfig.services.wecom
+const local = window.lwConfig.services.system
+const srcUrl = 'chinacoal'
+
+// export function getList(params) {
+//     return request({
+//         url: service + '/list',
+//         method: 'get',
+//         params,
+//     })
+// }
+// 新增
+export function add(data) {
+    return request({
+        url: service + '/activity/addActivity',
+        method: 'post',
+        data
+    })
+}
+// 列表
+export function listActivity(data) {
+    return request({
+        url: srcUrl + '/activity/listActivity',
+        method: 'post',
+        data
+    })
+}
+// 编辑状态
+export function editActivityStatus(params) {
+    return request({
+        url: service + '/activity/editActivityStatus',
+        method: 'get',
+        params
+    })
+}
+// 编辑
+export function editActivity(data) {
+    return request({
+        url: service + '/activity/editActivity',
+        method: 'post',
+        data
+    })
+}
+// 详情
+export function getActivity(params) {
+    return request({
+        url: service + '/activity/getActivity',
+        method: 'get',
+        params
+    })
+}
+
+// 权益券
+export function getEquityCoupon() {
+    return request({
+        url: local + '/chinacoal/equity/getEquityCoupon',
+        method: 'get'
+    })
+}
+
+// 红包拉新查看
+export function getRedEnvelopeRecord(params) {
+    return request({
+        url: local + '/chinacoal/redEnvelope/getRedEnvelopeRecord',
+        method: 'get',
+        params
+    })
+}
+
+// 导出
+export function exportRedEnvelopeRecord(data) {
+    return request({
+        url: local + '/chinacoal/redEnvelope/exportRedEnvelopeRecord',
+        method: 'get',
+        data,
+        responseType: 'blob'
+    })
+}
+
+// 表单活动记录
+export function getFormRecord(params) {
+    return request({
+        url: local + '/chinacoal/redEnvelope/getFormRecord',
+        method: 'get',
+        params
+    })
+}
+
+// 抽奖中奖人数
+export function getWinningRecord(params) {
+    return request({
+        url: local + '/chinacoal/redEnvelope/getWinningRecord',
+        method: 'get',
+        params
+    })
+}

+ 9 - 9
src/api/nocarRenewalFramenAllot/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalGfAllot/noCarRenwal?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewalGfAllot/noCarRenwal?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -25,21 +25,21 @@ export function getList(params) {
 //个非续保清单--跟进记录--查询
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalGf/selectGenjin',
+    url: service + '/chinacoal/renewalGf/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 //个非续保清单--跟进记录--新增/修改
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal//renewalGf/saveOrUpdateGenjin`,
+    url: service + `/chinacoal//renewalGf/saveOrUpdateGenjin`,
     method: 'post',
     data:params
   })
@@ -48,7 +48,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -56,7 +56,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectBjjl',
+    url: service + '/chinacoal/renewalFramenoList/selectBjjl',
     method: 'get',
     params
   })
@@ -65,7 +65,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectHisInsure',
+    url: service + '/chinacoal/renewalFramenoList/selectHisInsure',
     method: 'get',
     params
   })
@@ -74,7 +74,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/qwHisClaimDto',
+    url: service + '/chinacoal/renewalFramenoList/qwHisClaimDto',
     method: 'get',
     params
   })

+ 12 - 12
src/api/nocarRenewalGenjinQuery/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/nocarQueryRenwalList',
+    url: service + '/chinacoal/carRenewalGenjin/nocarQueryRenwalList',
     method: 'get',
     params
   })
@@ -24,20 +24,20 @@ export function getList(params) {
 
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectGenjin',
+    url: service + '/chinacoal/carRenewalGenjin/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/carRenewalGenjin/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/carRenewalGenjin/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/carRenewalGenjin/saveOrUpdateGenjin `,
+    url: service + `/chinacoal/carRenewalGenjin/saveOrUpdateGenjin `,
     method: 'post',
     data:params
   })
@@ -46,7 +46,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -54,7 +54,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectBjjl',
+    url: service + '/chinacoal/carRenewalGenjin/selectBjjl',
     method: 'get',
     params
   })
@@ -63,7 +63,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/selectHisInsure',
+    url: service + '/chinacoal/carRenewalGenjin/selectHisInsure',
     method: 'get',
     params
   })
@@ -72,7 +72,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/carRenewalGenjin/qwHisClaimDto',
+    url: service + '/chinacoal/carRenewalGenjin/qwHisClaimDto',
     method: 'get',
     params
   })
@@ -83,7 +83,7 @@ export function qwHisClaimDto(params) {
 //机构查询
 export function selectUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/selectUserDept',
+    url: service + '/chinacoal/userDept/selectUserDept',
     method: 'get',
     params
   })
@@ -92,8 +92,8 @@ export function selectUserDept(params) {
 //机构配置
 export function addUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/addUserDept',
+    url: service + '/chinacoal/userDept/addUserDept',
     method: 'post',
     data:params
   })
-}
+}

+ 11 - 11
src/api/nocarRenewalLawQuery/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalGf/noCarRenwal?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewalGf/noCarRenwal?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -25,21 +25,21 @@ export function getList(params) {
 //个非续保清单--跟进记录--查询
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalGf/selectGenjin',
+    url: service + '/chinacoal/renewalGf/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/renewalFramenoList/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 //个非续保清单--跟进记录--新增/修改
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal//renewalGf/saveOrUpdateGenjin`,
+    url: service + `/chinacoal//renewalGf/saveOrUpdateGenjin`,
     method: 'post',
     data:params
   })
@@ -48,7 +48,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -56,7 +56,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectBjjl',
+    url: service + '/chinacoal/renewalFramenoList/selectBjjl',
     method: 'get',
     params
   })
@@ -65,7 +65,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/selectHisInsure',
+    url: service + '/chinacoal/renewalFramenoList/selectHisInsure',
     method: 'get',
     params
   })
@@ -74,7 +74,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenoList/qwHisClaimDto',
+    url: service + '/chinacoal/renewalFramenoList/qwHisClaimDto',
     method: 'get',
     params
   })
@@ -85,7 +85,7 @@ export function qwHisClaimDto(params) {
 //机构查询
 export function selectUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/selectUserDept',
+    url: service + '/chinacoal/userDept/selectUserDept',
     method: 'get',
     params
   })
@@ -94,7 +94,7 @@ export function selectUserDept(params) {
 //机构配置
 export function addUserDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/userDept/addUserDept',
+    url: service + '/chinacoal/userDept/addUserDept',
     method: 'post',
     data:params
   })

+ 4 - 4
src/api/organization.js

@@ -302,7 +302,7 @@ export function bindDepts(data) {
 // 机构映射左侧列表查询
 export function leftSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -311,7 +311,7 @@ export function leftSelect(params) {
 
 export function select3Dept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/comDept/select3Dept',
+    url: service + '/chinacoal/comDept/select3Dept',
     method: 'get',
     params
   })
@@ -319,7 +319,7 @@ export function select3Dept(params) {
 // 机构映射点击左侧列表,右侧回显数据
 export function selectComDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/comDept/selectComDept',
+    url: service + '/chinacoal/comDept/selectComDept',
     method: 'get',
     params
   })
@@ -327,7 +327,7 @@ export function selectComDept(params) {
 // 机构映射保存数据
 export function addComDept(params) {
   return request({
-    url: service + '/linkwe-chinacoal/comDept/addComDept',
+    url: service + '/chinacoal/comDept/addComDept',
     method: 'post',
     data:params
   })

+ 12 - 12
src/api/otherCarXbAllot/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 // 查询接口
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/other/list/otherCarQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/other/list/otherCarQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data: {
       startDate: params.startDate,
@@ -35,7 +35,7 @@ export function getList(params) {
 // 导出接口
 export function carQueryRenwalListExport(data) {
   return request({
-    url: service + '/linkwe-chinacoal/other/list/otherCarQueryRenwalListExport',
+    url: service + '/chinacoal/other/list/otherCarQueryRenwalListExport',
     method: 'post',
     data: {
       startDate: data.startDate,
@@ -56,7 +56,7 @@ export function carQueryRenwalListExport(data) {
 // 任务移交接口
 export function renewalTurnover(params) {
   return request({
-    url: service + '/linkwe-chinacoal/other/list/renewalTurnover',
+    url: service + '/chinacoal/other/list/renewalTurnover',
     method: 'post',
     data: {
       type: 'otherCar',
@@ -69,7 +69,7 @@ export function renewalTurnover(params) {
 // 任务管理,查询分配人员
 export function listByDeptId(params) {
   return request({
-    url: service + '/linkwe-chinacoal/sysuser/listByDeptIdChild',
+    url: service + '/chinacoal/sysuser/listByDeptIdChild',
     method: 'get',
     params
   })
@@ -78,7 +78,7 @@ export function listByDeptId(params) {
 // 字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -87,7 +87,7 @@ export function selectDictionary(params) {
 // 跟进记录查询
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/otherCarXbAllot/selectGenjin',
+    url: service + '/chinacoal/otherCarXbAllot/selectGenjin',
     method: 'get',
     params
   })
@@ -96,7 +96,7 @@ export function getGjjl(params) {
 // 删除跟进记录
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/otherCarXbAllot/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/otherCarXbAllot/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
@@ -104,7 +104,7 @@ export function deleteGjjl(id) {
 // 新增编辑跟进记录
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/otherCarXbAllot/saveOrUpdateGenjin`,
+    url: service + `/chinacoal/otherCarXbAllot/saveOrUpdateGenjin`,
     method: 'post',
     data: params
   })
@@ -113,7 +113,7 @@ export function addEditGjjl(params) {
 // 报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/otherCarXbAllot/selectBjjl',
+    url: service + '/chinacoal/otherCarXbAllot/selectBjjl',
     method: 'get',
     params
   })
@@ -122,7 +122,7 @@ export function selectBjjl(params) {
 // 历史承保信息查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/otherCarXbAllot/selectHisInsure',
+    url: service + '/chinacoal/otherCarXbAllot/selectHisInsure',
     method: 'get',
     params
   })
@@ -153,4 +153,4 @@ export function addUserDept(params) {
     method: 'post',
     data: params
   })
-}
+}

+ 2 - 2
src/api/otherCarXbImport/index.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-const service = window.lwConfig.services.system + '/linkwe-chinacoal'
+const service = window.lwConfig.services.system + '/chinacoal'
 
 /**
  * 获取其他车险续保导入列表
@@ -93,4 +93,4 @@ export function confirmData(batchno) {
     method: 'get',
     params: { batchno }
   })
-}
+}

+ 3 - 3
src/api/otherCarXbInfo/index.js

@@ -7,7 +7,7 @@ const service = window.lwConfig.services.system
 // 字典查询接口
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -16,8 +16,8 @@ export function dictSelect(params) {
 // 其他车辆信息查询接口
 export function getList(params) {
   return request({
-    url: service + '/linkwe-chinacoal/other/list/otherCarGenJIn',
+    url: service + '/chinacoal/other/list/otherCarGenJIn',
     method: 'get',
     params
   })
-}
+}

+ 2 - 2
src/api/otherCarXbManage/infoMsg.js

@@ -1,5 +1,5 @@
 import request from '@/utils/request'
-const service = window.lwConfig.services.system + '/linkwe-chinacoal'
+const service = window.lwConfig.services.system + '/chinacoal'
 
 /**
  * 查询其他车险信息列表
@@ -191,4 +191,4 @@ export function allotTurnover(data) {
       oldjqenddate: data.oldjqenddate
     }
   })
-}
+}

+ 13 - 13
src/api/renewalCount/index.js

@@ -5,7 +5,7 @@ const service = window.lwConfig.services.system
 //车辆续保统计查询
 export function carCount(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalCount/carCount',
+        url: service + '/chinacoal/renewalCount/carCount',
         method: 'get',
         params
     })
@@ -13,7 +13,7 @@ export function carCount(params) {
 //车辆续保统计  导出
 export function carCountExport(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalCount/carCountExport',
+        url: service + '/chinacoal/renewalCount/carCountExport',
         method: 'get',
         responseType: "blob",
         params
@@ -22,7 +22,7 @@ export function carCountExport(params) {
 // 续保率统计查询
 export function renewalLv(params) {
     return request({
-        url: service + `/linkwe-chinacoal/renewalCount/renewalLv`,
+        url: service + `/chinacoal/renewalCount/renewalLv`,
         method: 'get',
         params
 
@@ -31,7 +31,7 @@ export function renewalLv(params) {
 //续保率统计导出
 export function renewalLvExport(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalCount/renewalLvExport',
+        url: service + '/chinacoal/renewalCount/renewalLvExport',
         method: 'get',
         responseType: "blob",
         params
@@ -40,7 +40,7 @@ export function renewalLvExport(params) {
 // 续保过程统计查询
 export function renewalFun(params) {
     return request({
-        url: service + `/linkwe-chinacoal/renewalCount/renewalFun`,
+        url: service + `/chinacoal/renewalCount/renewalFun`,
         method: 'get',
         params
 
@@ -49,7 +49,7 @@ export function renewalFun(params) {
 //续保过程统计导出
 export function renewalFunExport(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalCount/renewalFunExport',
+        url: service + '/chinacoal/renewalCount/renewalFunExport',
         method: 'get',
         responseType: "blob",
         params
@@ -59,7 +59,7 @@ export function renewalFunExport(params) {
 // 续保任务查询
 export function renewalUser(params) {
     return request({
-        url: service + `/linkwe-chinacoal/renewalCount/renewalUser`,
+        url: service + `/chinacoal/renewalCount/renewalUser`,
         method: 'get',
         params
 
@@ -69,7 +69,7 @@ export function renewalUser(params) {
 //续保任务导出
 export function renewalUserExport(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalCount/renewalUserExport',
+        url: service + '/chinacoal/renewalCount/renewalUserExport',
         method: 'get',
         responseType: "blob",
         params
@@ -80,7 +80,7 @@ export function renewalUserExport(params) {
 // 月度续保单
 export function monthRenewalLv(params) {
     return request({
-        url: service + `/linkwe-chinacoal/renewalCount/monthRenewalLv`,
+        url: service + `/chinacoal/renewalCount/monthRenewalLv`,
         method: 'get',
         params
 
@@ -88,10 +88,10 @@ export function monthRenewalLv(params) {
 }
 
 
-// // 
+// //
 export function hasRenewalCount(params) {
     return request({
-        url: service + `/linkwe-chinacoal/renewalCount/hasRenewalCount?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+        url: service + `/chinacoal/renewalCount/hasRenewalCount?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
         method: 'post',
         data:params
 
@@ -102,7 +102,7 @@ export function hasRenewalCount(params) {
 //已续保清单统计导出
 export function hasRenewalDownload(data) {
     return request({
-      url: service + '/linkwe-chinacoal/renewalCount/hasRenewalDownload',
+      url: service + '/chinacoal/renewalCount/hasRenewalDownload',
       method: 'post',
       responseType: "blob",
       data
@@ -113,7 +113,7 @@ export function hasRenewalDownload(data) {
 //
 // export function addEditGjjl(params) {
 //   return request({
-//     url: service + `/linkwe-chinacoal/renewalLaw/saveOrUpdateLaw`,
+//     url: service + `/chinacoal/renewalLaw/saveOrUpdateLaw`,
 //     method: 'post',
 //     data:params
 //   })

+ 3 - 3
src/api/renewalCount/xbrwzztj.js

@@ -4,7 +4,7 @@ const service = window.lwConfig.services.system
 // 查询续保任务状态统计列表
 export function xbrwzztj(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalCount/xbrwzztj`,
+    url: service + `/chinacoal/renewalCount/xbrwzztj`,
     method: 'post',
     data:params
   })
@@ -13,9 +13,9 @@ export function xbrwzztj(params) {
 // 导出续保任务状态统计
 export function xbrwzztjExport(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalCount/xbrwzztjExport`,
+    url: service + `/chinacoal/renewalCount/xbrwzztjExport`,
     method: 'post',
     data: params,
     responseType: 'blob'
   })
-}
+}

+ 9 - 9
src/api/renewalFc/index.js

@@ -5,7 +5,7 @@ const service = window.lwConfig.services.system
 //车辆续保统计查询
 export function fcSendMsg(params) {
     return request({
-        url: service + '/linkwe-chinacoal/renewalFc/fcSendMsg',
+        url: service + '/chinacoal/renewalFc/fcSendMsg',
         method: 'get',
         params
     })
@@ -14,7 +14,7 @@ export function fcSendMsg(params) {
 //导出
 export function fcSendMsgDownload(data) {
     return request({
-      url: service + '/linkwe-chinacoal/renewalFc/fcSendMsgDownload',
+      url: service + '/chinacoal/renewalFc/fcSendMsgDownload',
       method: 'post',
       responseType: "blob",
       data
@@ -23,7 +23,7 @@ export function fcSendMsgDownload(data) {
 // 续保率统计查询
 export function renewalLv(params) {
   return request({
-      url: service + `/linkwe-chinacoal/renewalGf/renewalLv`,
+      url: service + `/chinacoal/renewalGf/renewalLv`,
       method: 'post',
       data: params,
   })
@@ -31,7 +31,7 @@ export function renewalLv(params) {
 // 续保率统计导出
 export function renewalLvDownload(data) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalGf/renewalLvDownload',
+    url: service + '/chinacoal/renewalGf/renewalLvDownload',
     method: 'post',
     responseType: "blob",
     data
@@ -44,7 +44,7 @@ export function renewalLvDownload(data) {
 // 月度续保单
 export function monthRenewalLv(params) {
   return request({
-      url: service + `/linkwe-chinacoal/renewalGf/monthRenewalLv`,
+      url: service + `/chinacoal/renewalGf/monthRenewalLv`,
       method: 'get',
       params
 
@@ -55,7 +55,7 @@ export function monthRenewalLv(params) {
 // 短信统计  查询
 export function sendMsgCount(params) {
   return request({
-      url: service + `/linkwe-chinacoal/renewalGf/sendMsgCount?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+      url: service + `/chinacoal/renewalGf/sendMsgCount?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
       method: 'post',
       data: params,
   })
@@ -63,7 +63,7 @@ export function sendMsgCount(params) {
 // 短信统计  导出
 export function sendMsgCountDownload(data) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalGf/sendMsgCountDownload',
+    url: service + '/chinacoal/renewalGf/sendMsgCountDownload',
     method: 'post',
     responseType: "blob",
     data
@@ -75,7 +75,7 @@ export function sendMsgCountDownload(data) {
 // 产品续保率统计查询
 export function cplanRenewalLv(params) {
   return request({
-      url: service + `/linkwe-chinacoal/renewalGf/cplanRenewalLv`,
+      url: service + `/chinacoal/renewalGf/cplanRenewalLv`,
       method: 'post',
       data: params,
   })
@@ -83,7 +83,7 @@ export function cplanRenewalLv(params) {
 // 产品续保率统计导出
 export function cplanRenewalLvDownload(data) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalGf/cplanRenewalLvDownload',
+    url: service + '/chinacoal/renewalGf/cplanRenewalLvDownload',
     method: 'post',
     responseType: "blob",
     data

+ 9 - 9
src/api/renewalFramenAllot/index.js

@@ -6,7 +6,7 @@ const service = window.lwConfig.services.system
 
 export function dictSelect(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -15,7 +15,7 @@ export function dictSelect(params) {
 
 export function getList(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenAllot/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
+    url: service + `/chinacoal/renewalFramenAllot/carQueryRenwalList?pageNum=${params.pageNum}&pageSize=${params.pageSize}`,
     method: 'post',
     data:params
 
@@ -25,20 +25,20 @@ export function getList(params) {
 
 export function getGjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/selectGenjin',
+    url: service + '/chinacoal/renewalFramenAllot/selectGenjin',
     method: 'get',
     params
   })
 }
 export function deleteGjjl(id) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenAllot/deleteByKeyId/${id}`,
+    url: service + `/chinacoal/renewalFramenAllot/deleteByKeyId/${id}`,
     method: 'get',
   })
 }
 export function addEditGjjl(params) {
   return request({
-    url: service + `/linkwe-chinacoal/renewalFramenAllot/saveOrUpdateGenjin `,
+    url: service + `/chinacoal/renewalFramenAllot/saveOrUpdateGenjin `,
     method: 'post',
     data:params
   })
@@ -47,7 +47,7 @@ export function addEditGjjl(params) {
 //字典表接口
 export function selectDictionary(params) {
   return request({
-    url: service + '/linkwe-chinacoal/dict/select',
+    url: service + '/chinacoal/dict/select',
     method: 'get',
     params
   })
@@ -55,7 +55,7 @@ export function selectDictionary(params) {
 //报价记录查询
 export function selectBjjl(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/selectBjjl',
+    url: service + '/chinacoal/renewalFramenAllot/selectBjjl',
     method: 'get',
     params
   })
@@ -64,7 +64,7 @@ export function selectBjjl(params) {
 //报价记录查询
 export function selectHisInsure(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/selectHisInsure',
+    url: service + '/chinacoal/renewalFramenAllot/selectHisInsure',
     method: 'get',
     params
   })
@@ -73,7 +73,7 @@ export function selectHisInsure(params) {
 //历史理赔信息查询
 export function qwHisClaimDto(params) {
   return request({
-    url: service + '/linkwe-chinacoal/renewalFramenAllot/qwHisClaimDto',
+    url: service + '/chinacoal/renewalFramenAllot/qwHisClaimDto',
     method: 'get',
     params
   })

+ 73 - 0
src/api/sop/customerOperationsSop.js

@@ -0,0 +1,73 @@
+import request from '@/utils/request'
+const service = window.lwConfig.services.wecom
+//智能打标
+//  获取标签组
+export function tagList(params) {
+  return request({
+    url: service+'/tag/list',
+    method: 'get',
+    params
+  })
+}
+//  新增
+export function addSop(data) {
+  return request({
+    url: service+'/sop/addSop',
+    method: 'post',
+    data
+  })
+}
+
+// 编辑
+export function updateSop(data) {
+  return request({
+    url: service+'/sop/updateSop',
+    method: 'post',
+    data
+  })
+}
+
+//查询
+export function getSop(id) {
+  return request({
+    url: service + '/sop/getSop?id='+id,
+    method: 'get',
+  })
+}
+// 删除
+export function deleteSop(id) {
+  return request({
+    url: service + '/sop/deleteSop?id='+id,
+    method: 'get',
+  })
+}
+//sop分页列表
+
+export function listSop(params) {
+  return request({
+    url: service + '/sop/listSop',
+    method: 'get',
+    params
+  })
+}
+//启用/禁用
+export function disableStatus(id) {
+  return request({
+    url: service + '/sop/disableStatus?id='+id,
+    method: 'get',
+  })
+}
+//sop复制
+export function copySop(id) {
+  return request({
+    url: service + '/sop/copySop?id='+id,
+    method: 'get',
+  })
+}
+//获取素材
+export function materialListNew() {
+  return request({
+    url: service + '/material/listNew',
+    method: 'get',
+  })
+}

+ 36 - 0
src/components/UploadToCos.vue

@@ -46,6 +46,10 @@
         type: Array,
         default: null // () => [100, 100]
       },
+      // imgRadio: {
+      //     type: Boolean,
+      //     default: false
+      // },
       // 允许上传的文件格式后缀名 eg:["jpg", "png"],['*']为不限制,各类型有默认限制 参见: formatDefault
       format: {
         type: Array,
@@ -424,6 +428,38 @@
         if (this.type === '0') {
           // 图片
           let maxImgPx = this.maxImgPx
+          let imgRadio = this.imgRadio
+          // if(imgRadio) {
+          //     try {
+          //         await new Promise((resolve) => {
+          //             let width, height
+          //             let image = new Image()
+          //             image.onload = () => {
+          //                 width = image.width
+          //                 height = image.height
+          //                 if((width / height).toFixed(2) !== (16/9).toFixed(2)) {
+          //                     this.$message.error('上传图片比例必须为16:9')
+          //                     validate = false
+          //                 }
+          //                 window.URL && window.URL.revokeObjectURL(image.src)
+          //                 resolve()
+          //             }
+          //             if (window.URL) {
+          //                 let url = window.URL.createObjectURL(file)
+          //                 image.src = url
+          //             } else if (window.FileReader) {
+          //                 let reader = new FileReader()
+          //                 reader.onload = function (e) {
+          //                     let data = e.target.result
+          //                     image.src = data
+          //                 }
+          //                 reader.readAsDataURL(file)
+          //             }
+          //         })
+          //     } catch (e) {
+          //         console.error(e)
+          //     }
+          // }
           if (maxImgPx) {
             try {
               await new Promise((resolve) => {

+ 638 - 0
src/components/templateTable.vue

@@ -0,0 +1,638 @@
+<template>
+  <div style="position: relative" ref="commonTable">
+    <!--表格栏-->
+    <el-table id="commonTable" ref="doLayout" :data="data.rows" :highlight-current-row="highlightCurrentRow"
+      @selection-change="selectionChange" @row-click="rowClick" @current-change="handleCurrentChange" :border="border"
+      :stripe="stripe" :show-summary="showSummary" :show-overflow-tooltip="showOverflowTooltip"
+      :height="tableHeights ? tableHeights : tableHeight" :size="size" :align="align" style="width: 100%"
+      :row-class-name="tableRowClassName" :expand-row-keys="expandRows" row-key="id">
+      <el-table-column type="selection" width="50" fixed align="center" v-if="
+        showBatchDelete ||
+        refreshStatus ||
+        showBatchSettled ||
+        showBatchPrint ||
+        customToolseletted ||
+        disableInBulk ||
+        select
+      "></el-table-column>
+      <el-table-column v-if="SerialShow" label="序号" type="index" width="50" align="center"></el-table-column>
+      <template v-for="column in columns">
+        <el-table-column header-align="center" align="center" :prop="column.prop" :label="column.label"
+          :width="column.width" :min-width="column.minWidth" :fixed="column.fixed" :key="column.prop"
+          :type="column.type" :formatter="column.formatter" :sortable="column.sortable ? column.sortable : false">
+          <template v-for="columnchildren in column.children">
+            <el-table-column v-if="columnchildren" header-align="center" align="center" :prop="columnchildren.prop"
+              :label="columnchildren.label" :width="columnchildren.width" :min-width="columnchildren.minWidth"
+              :fixed="columnchildren.fixed" :key="columnchildren.prop" :type="columnchildren.type"
+              :formatter="columnchildren.formatter" :sortable="columnchildren.sortable == null ? true : columnchildren.sortable
+                ">
+            </el-table-column>
+          </template>
+        </el-table-column>
+      </template>
+      <el-table-column label="操作" :width="operationWidth" :fixed="isNotFixed ? false : 'right'" v-if="showOperation"
+        header-align="center" align="center" class-name="table-fiexd">
+        <template slot-scope="scope">
+          <slot name="buttonSlot" :row="scope.row" :index="scope.$index"></slot>
+        </template>
+      </el-table-column>
+
+    </el-table>
+    <!--分页栏-->
+    <!-- 底部分页 -->
+    <!-- <kt-button :label="customToolName" :perms="permscustomTool" :size="size" type="danger" @click="customToolMethod()"
+        :disabled="selections.length === 0" style="float: left" v-if="customToolseletted" />
+      <kt-button class="debutton" :label="deleteName" :perms="permsDelete" :size="size" type="danger"
+        @click="handleBatchDelete()" :disabled="selections.length === 0" style="float: left"
+        v-if="showBatchDelete & showOperation" />
+      <kt-button class="debutton" :label="refreshStatusName" :size="size" type="danger" @click="refreshStatusBatch()"
+        :disabled="selections.length === 0" style="float: left" v-if="refreshStatus" />
+      <kt-button :label="customToolName1" :perms="permscustomTool" :size="size" type="danger"
+        @click="customToolMethod1()" :disabled="selections.length === 0" style="float: left"
+        v-if="customToolseletted" />
+      <kt-button :label="disableInBulkName" :perms="disableInBulkperms" :size="size" type="danger"
+        @click="disableInBulkClick()" :disabled="selections.length === 0" style="float: left" v-if="disableInBulk" />
+      <kt-button :label="settledName" :perms="permsSettled" :size="size" type="danger" @click="handleBatchSettled()"
+        :disabled="selections.length === 0" style="float: left" v-if="showBatchSettled" />
+      <kt-button label="导出Excel" :perms="permsExcel" :size="size" type="danger" @click="handleBatchPrint()"
+        style="float: left" v-if="showBatchPrint" />
+      <div v-if="tableSelectedCount" class="tableSelectedCountClass">已选
+        <span>{{ tableSelectedCount }}</span>
+        条
+      </div> -->
+    <pagination v-show="Number(data.total) > 0 && data.total" :total="Number(data.total)" :page.sync="data.pageNum"
+      :limit.sync="data.pageSize" @pagination="findPage()" />
+  </div>
+</template>
+<script>
+export default {
+  name: "templateTable",
+  components: {
+  },
+  props: {
+    //批量刷新状态
+    refreshStatus: {
+      type: Boolean,
+      default: false
+    },
+    // 承保规则expend内容
+    agreementUnderwritingRuleShow: {
+      type: Boolean,
+      default: false
+    },
+    select: {
+      type: Boolean,
+      default: false,
+    },
+    tableHeights: {
+      type: Number,
+    },
+    operationWidth: {
+      type: Number,
+      default: 200,
+    },
+    // 是否需要固定列(指操作那一列)
+    isNotFixed: {
+      type: Boolean,
+      default: false
+    },
+    showBatchSettled: {
+      //显示批量结算
+      type: Boolean,
+      default: false,
+    },
+    SerialShow: {
+      type: Boolean,
+      default: false,
+    },
+    customToolName: {
+      type: String,
+    },
+    customToolName1: {
+      type: String,
+    },
+    permscustomTool: {
+      type: String,
+    },
+    customToolseletted: {
+      // 自定义操作组件
+      type: Boolean,
+      default: false,
+    },
+    disableInBulkName: {
+      type: String,
+    },
+    disableInBulkperms: {
+      type: String,
+    },
+    disableInBulk: {
+      // 批量禁用
+      type: Boolean,
+      default: false,
+    },
+    settledName: {
+      //批量按钮name
+      type: String,
+    },
+    deleteName: {
+      type: String,
+    },
+    refreshStatusName: {
+      //批量更新状态按钮Name
+      type: String,
+    },
+    showBatchPrint: {
+      //显示批量导出
+      type: Boolean,
+      default: false,
+    },
+    //显示合计
+    showSummary: {
+      type: Boolean,
+      default: false,
+    },
+    //更多操作
+    buttonDropdown: {
+      type: Array,
+      default: () => [],
+    },
+    isshowpagination: {
+      //是否显示分页栏
+      type: Boolean,
+      default: true,
+    },
+
+    showSummaryFieldList: Array, //自定义合计列配置
+    keyName: String, //主键字段名
+    columns: Array, // 表格列配置
+    data: {}, // 表格分页数据
+    permsEdit: String, // 编辑权限标识
+    permsDelete: String, // 底部按钮标识
+    permsSettled: String, // 底部按钮标识
+    permsExcel: String, // 底部按钮标识
+    size: {
+      // 尺寸样式
+      type: String,
+      default: "small ",
+    },
+    align: {
+      // 文本对齐方式
+      type: String,
+      default: "left",
+    },
+    // maxHeight: {  // 表格最大高度
+    //   type: Number,
+    //   default: 1420
+    // },
+    // height: {  // 表格最大高度
+    //   type: Number,
+    //   default: 250
+    // },
+    showOperation: {
+      // 是否显示操作组件
+      type: Boolean,
+      default: true,
+    },
+    border: {
+      // 是否显示边框
+      type: Boolean,
+      default: false,
+    },
+    stripe: {
+      // 是否显示斑马线
+      type: Boolean,
+      default: true,
+    },
+    highlightCurrentRow: {
+      // 是否高亮当前行
+      type: Boolean,
+      default: true,
+    },
+    showOverflowTooltip: {
+      // 是否单行显示
+      type: Boolean,
+      default: true,
+    },
+    showBatchDelete: {
+      // 是否显示操作组件
+      type: Boolean,
+      default: false,
+    },
+    showSysUserAccountCardList: {
+      // 是否显示二级列组件
+      type: Boolean,
+      default: false,
+    },
+    showDefaultPage: {
+      // 是否默认调用一次查询
+      type: Boolean,
+      default: true,
+    }
+  },
+  data() {
+    return {
+      tableSelectedCount: "",
+      tableHeight: 0,
+      loading: false, // 加载标识
+      selections: [], // 列表选中列
+      pageRequest: {
+        pageNum: 1,
+        pageSize: 20,
+      },
+      taskPool: false,
+
+      underwritingRulesAddVehicleFactorVisible: false,
+      underwritingRulesForm: {
+        //承保因子表单项
+        agreementId: "", //协议id
+        ruleDescription: "", //规则描述
+        rulesStartDate: "",//规则起期
+        rulesEndDate: "",//规则止期
+        validInd: "1", //是否有效
+        rulesAttrList: [],//规则属性
+        carClassList: [],
+        areanumberplateList: [],
+        licenseAreaList: [],
+      },
+      expandRows: []
+    };
+  },
+  created() {
+  },
+  watch: {
+
+  },
+  methods: {
+    //获取银行卡信息
+    getSysUserAccountCardList(row) {
+      if (typeof row.expanded === "undefined") {
+        row.expanded = true;
+      }
+      if (row.expanded) {
+        if (this.expandRows.includes(row.id)) {
+          this.expandRows = this.expandRows.filter(item => item !== row.id);
+        } else {
+          this.expandRows.push(row.id);
+        }
+      } else {
+        this.expandRows = this.expandRows.filter(item => item !== row.id);
+      }
+      row.expanded = !row.expanded;
+      if (row.sysUserAccountCardList.length === 0) {
+        this.$api.dept.queryCardListByUserId(row.userId).then((res) => {
+          if (res.code == 200) {
+            if (res.data) {
+              row.sysUserAccountCardList = res.data;
+              this.$set(this.data.content, row.index, row)
+            }
+          }
+        });
+      }
+      //this.$refs.doLayout.toggleRowExpansion(row, row.expanded);
+    },
+
+    tableRowClassName(row, rowIndex) {
+      // if (!!row.fieldName24 && row.fieldName24.indexOf("未") >= 0) {
+      //   return "warningRow";
+      // } else if (!!row.fieldName24 && row.fieldName24.indexOf("已") >= 0) {
+      // return "successRow";
+      // }
+      if (!!this.taskPool) {
+        if (row.row.isExternal === 1) {
+          return "flagRow";
+        } else {
+          return "";
+        }
+      }
+      this.$emit("tableRowClassName", row);
+      // return '';
+    },
+
+    // 分页查询
+    findPage: function () {
+      this.loading = true;
+      let callback = (res) => {
+        this.loading = false;
+        //解决操作栏位置偏移问题
+        this.$nextTick(() => {
+          this.$refs.doLayout.doLayout();
+        }, 200);
+      };
+      this.$emit("findPage", {
+        pageRequest: this.pageRequest,
+        callback: callback,
+      });
+    },
+    hideLoading() {
+      this.loading = false;
+    },
+    // 选择切换
+    selectionChange: function (selections) {
+      let idlist = [];
+      this.tableSelectedCount = selections.length;
+      this.selections = selections;
+      // this.selections.map((item) => idlist.push(item.id));
+      this.$emit("selectionChange", selections);
+    },
+    // 选择切换
+    handleCurrentChange: function (val) {
+      this.$emit("handleCurrentChange", {
+        val: val,
+      });
+    },
+
+    rowClick: function (row) {
+      this.$emit("rowClick", {
+        row: row,
+      });
+    },
+    // 换页刷新
+    refreshPageRequest: function (pageNum) {
+      this.pageRequest.pageNum = pageNum;
+      // this.pageRequest.pageSize = 20;
+      this.findPage();
+    },
+    // 每页条数发生改变
+    handleSizeChange(pageSize) {
+      this.pageRequest.pageSize = pageSize;
+      this.findPage();
+    },
+    signStateChanged(index, row) {
+      this.$emit("signStateChanged", {
+        index: index,
+        row: row,
+      });
+    },
+    // 按钮编辑
+    handleBtnEdit: function (index, row) {
+      this.$emit("handleBtnEdit", {
+        index: index,
+        row: row,
+      });
+    },
+    // 编辑
+    handleEdit: function (index, row) {
+      this.$emit("handleEdit", {
+        index: index,
+        row: row,
+      });
+      // this.$emit('findLeftTreeData')
+    },
+    handleBreak: function (index, row, i, r) {
+      this.$emit("handleBreak", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+
+    handleTimeLine: function (index, row, i, r) {
+      this.$emit("handleTimeLine", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+    handleRebind: function (index, row, i, r) {
+      this.$emit("handleRebind", {
+        index: index,
+        row: row,
+        i: i,
+        r: r,
+      });
+    },
+    // 删除
+    handleDelete: function (index, row) {
+      let _keyName = "id";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+
+      this.delete(row[_keyName]);
+    },
+    handleButton1: function (index, row) {
+      this.$emit("handleButton1", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton2: function (index, row) {
+      this.$emit("handleButton2", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton3: function (index, row) {
+      this.$emit("handleButton3", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton4: function (index, row) {
+      this.$emit("handleButton4", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton5: function (index, row) {
+      this.$emit("handleButton5", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton6: function (index, row) {
+      this.$emit("handleButton6", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton7: function (index, row) {
+      this.$emit("handleButton7", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton8: function (index, row) {
+      this.$emit("handleButton8", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton10: function (index, row) {
+      this.$emit("handleButton10", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton9: function (index, row) {
+      this.$emit("handleButton9", {
+        index: index,
+        row: row,
+      });
+    },
+    handleButton: function (index, row) {
+      this.$emit("handleButton", {
+        index: index,
+        row: row,
+      });
+    },
+    //删除单个
+    handleDeleteFlag: function (index, row) {
+      this.$emit("handleDeleteFlag", { index: index, row: row });
+      // var _keyName = "id";
+      // if (!!this.keyName) {
+      //   _keyName = this.keyName;
+      // }
+      // let ids = row[_keyName];
+      // this.$confirm("确认删除吗?", "提示", {
+      //   type: "warning",
+      // })
+      //   .then(() => {
+      //     let params = [];
+      //     let idArray = (ids + "").split(",");
+      //     for (var i = 0; i < idArray.length; i++) {
+      //       var obj = {};
+      //       obj[_keyName] = idArray[i];
+      //       params.push(obj);
+      //     }
+      //     this.loading = true;
+      //     let callback = (res) => {
+      //       if (res.code == 200) {
+      //         this.$message({
+      //           message: "操作成功",
+      //           type: "success",
+      //         });
+      //         this.findPage();
+      //         // this.$emit('findLeftTreeData')
+      //       } else {
+      //         this.$message({
+      //           message: "操作失败, " + res.msg,
+      //           type: "error",
+      //         });
+      //       }
+      //     };
+      //     this.$emit("handleDeleteFlag", {
+      //       params: params,
+      //       callback: callback,
+      //     });
+      //     this.loading = false;
+      //   })
+      //   .catch(() => {
+      //     this.loading = false;
+      //   });
+    },
+    //批量刷新状态
+    refreshStatusBatch: function () {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.subOrderId));
+      this.$emit("refreshStatusBatch", idlist);
+    },
+    // 批量删除
+    handleBatchDelete: function () {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("handleDelete", idlist);
+    },
+    //自定义批量操作按钮
+    customToolMethod() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("customTool", idlist);
+    },
+
+    //自定义批量操作按钮1
+    customToolMethod1() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("customTool1", idlist);
+    },
+    //批量导出
+    disableInBulkClick() {
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item.id));
+      this.$emit("disableInBulkClick", idlist);
+    },
+    // 删除操作
+    delete: function (ids) {
+      var _keyName = "id";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+
+      this.$confirm("确认删除吗?", "提示", {
+        type: "warning",
+      })
+        .then(() => {
+          let params = [];
+          let idArray = (ids + "").split(",");
+          for (var i = 0; i < idArray.length; i++) {
+            var obj = {};
+            obj[_keyName] = idArray[i];
+            params.push(obj);
+          }
+          let callback = (res) => {
+            if (res.code == 200) {
+              this.$message({
+                message: "操作成功",
+                type: "success",
+              });
+              this.findPage();
+              // this.$emit('findLeftTreeData')
+            } else {
+              this.$message({
+                message: "操作失败, " + res.msg,
+                type: "error",
+              });
+            }
+          };
+          this.$emit("handleDelete", {
+            params: params,
+            callback: callback,
+          });
+        })
+        .catch(() => { });
+    },
+    //批量结算
+    handleBatchSettled: function () {
+      let _keyName = "orderno";
+      if (!!this.keyName) {
+        _keyName = this.keyName;
+      }
+      let idlist = [];
+      this.selections.map((item) => idlist.push(item[_keyName]));
+      this.$emit("handleSettled", idlist);
+    },
+    //批量打印
+    handleBatchPrint: function () {
+      // let _keyName = "orderno";
+      // if(!!this.keyName){
+      //   _keyName = this.keyName;
+      // }
+      // let ids = this.selections.map(item => item[_keyName]).toString()
+      // console.log(ids);
+      this.$emit("handlePrint");
+    },
+  },
+
+  mounted() {
+    const that = this;
+    if (this.showDefaultPage) {
+      that.refreshPageRequest(1);
+    }
+    setTimeout(() => {
+      let tableTop = that.$refs.commonTable.offsetTop;
+      let height = window.innerHeight;
+      let aaa= this.data.total > 0 ? 225 : 175;
+      that.tableHeight = height - tableTop - aaa  + "px";
+
+    }, 100);
+    // window.onresize = function () {
+    // };
+  },
+};
+</script>
+
+
+<style lang="scss" scoped></style>

+ 12 - 3
src/directive/index.js

@@ -1,17 +1,26 @@
-import hasRole from './permission/hasRole'
-import hasPermi from './permission/hasPermi'
-import preventReClick from './preventReClick'
+// 导入权限相关的自定义指令
+import hasRole from './permission/hasRole' // 导入检查用户角色的指令
+import hasPermi from './permission/hasPermi' // 导入检查用户权限的指令
+import preventReClick from './preventReClick' // 导入防止重复点击的指令
 
+// 定义一个安装函数,用于注册自定义指令
 const install = function(Vue) {
+  // 注册 hasRole 指令
   Vue.directive('hasRole', hasRole)
+  // 注册 hasPermi 指令
   Vue.directive('hasPermi', hasPermi)
+  // 注册 preventReClick 指令
   Vue.directive('preventReClick', preventReClick)
 }
 
+// 检查是否在浏览器环境中使用 Vue
 if (window.Vue) {
+  // 如果 Vue 已经在全局范围内定义,将指令暴露到全局
   window['hasRole'] = hasRole
   window['hasPermi'] = hasPermi
+  // 使用 install 函数注册指令
   Vue.use(install) // eslint-disable-line
 }
 
+// 导出 install 函数,以便在其他地方使用
 export default install

+ 14 - 6
src/directive/permission/hasPermi.js

@@ -1,26 +1,34 @@
 /**
-* 操作权限处理
-*/
+ * 操作权限处理指令
+ * 该指令用于根据用户的权限控制元素的显示与隐藏
+ */
 
 import store from '@/store'
 
 export default {
+  // 当指令被绑定到元素上时调用
   inserted (el, binding, vnode) {
-    const { value } = binding
-    const all_permission = "*:*:*";
-    const permissions = store.getters && store.getters.permissions
+    const { value } = binding // 获取指令传入的值
+    const all_permission = "*:*:*"; // 定义一个常量,表示所有权限
+    const permissions = store.getters && store.getters.permissions // 从 Vuex store 获取当前用户的权限列表
 
+    // 检查指令值是否存在,并且是一个非空数组
     if (value && value instanceof Array && value.length > 0) {
-      const permissionFlag = value
+      const permissionFlag = value // 将传入的权限值赋给 permissionFlag
 
+      // 检查用户是否具有所需的权限
       const hasPermissions = permissions.some(permission => {
+        // 如果用户拥有所有权限,或者用户的权限列表中包含所需的权限
         return all_permission === permission || permissionFlag.includes(permission)
       })
 
+      // 如果用户没有所需的权限
       if (!hasPermissions) {
+        // 可选:从 DOM 中移除该元素
         // el.parentNode && el.parentNode.removeChild(el)
       }
     } else {
+      // 如果没有设置操作权限标签值,抛出错误
       throw new Error(`请设置操作权限标签值`)
     }
   }

+ 16 - 8
src/directive/permission/hasRole.js

@@ -1,27 +1,35 @@
 /**
-* 角色权限处理
-*/
+ * 角色权限处理指令
+ * 该指令用于根据用户的角色控制元素的显示与隐藏
+ */
 
-import store from '@/store'
+import store from '@/store' // 导入 Vuex store,以获取用户的角色信息
 
 export default {
+  // 当指令被绑定到元素上时调用
   inserted(el, binding, vnode) {
-    const { value } = binding
-    const super_admin = "admin";
-    const roles = store.getters && store.getters.roles
+    const { value } = binding // 获取指令传入的值
+    const super_admin = "admin"; // 定义超级管理员角色
+    const roles = store.getters && store.getters.roles // 从 Vuex store 获取当前用户的角色列表
 
+    // 检查指令值是否存在,并且是一个非空数组
     if (value && value instanceof Array && value.length > 0) {
-      const roleFlag = value
+      const roleFlag = value // 将传入的角色值赋给 roleFlag
 
+      // 检查用户是否具有所需的角色
       const hasRole = roles.some(role => {
+        // 如果用户是超级管理员,或者用户的角色列表中包含所需的角色
         return super_admin === role || roleFlag.includes(role)
       })
 
+      // 如果用户没有所需的角色
       if (!hasRole) {
+        // 从 DOM 中移除该元素
         el.parentNode && el.parentNode.removeChild(el)
       }
     } else {
-      throw new Error(`请设置角色权限标签值"`)
+      // 如果没有设置角色权限标签值,抛出错误
+      throw new Error(`请设置角色权限标签值`)
     }
   }
 }

+ 140 - 1
src/styles/index.scss

@@ -187,7 +187,7 @@ div:focus {
       align-items: center;
       margin-bottom: 20px;
       font-size: 16px;
-      font-weight: 500;
+      font-weight:500;
       color: var(--font-black);
       line-height: 1;
       .desc {
@@ -358,3 +358,142 @@ div:focus {
     padding-bottom: 0 !important;
   }
 }
+/* flex布局 */
+.u-f,
+.u-f-ac,
+.u-f-ajc,
+.u-f-jsb,
+.u-f-je,
+.u-f1,
+.u-f-column,
+.u-f-sa {
+  display: flex;
+}
+
+.u-f-ac,
+.u-f-ajc {
+  align-items: center;
+}
+
+.u-f-ajc {
+  justify-content: center;
+}
+
+.u-f-jsb {
+  justify-content: space-between;
+}
+
+.u-f-je {
+  justify-content: flex-end;
+}
+
+.u-f-sa {
+  justify-content: space-around;
+}
+
+.u-f1 {
+  flex: 1;
+}
+
+.u-f-column {
+  flex-direction: column;
+}
+
+.flex {
+  display: flex;
+
+}
+
+.f-wrap {
+  flex-wrap: wrap;
+}
+
+.j-s {
+  justify-content: space-between;
+}
+
+.j-c {
+  justify-content: center;
+}
+
+.j-start {
+  justify-content: flex-start;
+}
+
+.j-end {
+  justify-content: flex-end;
+}
+
+.a-c {
+  align-items: center;
+}
+
+.a-start {
+  align-items: flex-start;
+}
+
+.a-end {
+  align-items: flex-end;
+}
+
+.f-c {
+  flex-direction: column;
+}
+
+.p-1 {
+  padding: 10px;
+}
+
+.p-2 {
+  padding: 20px;
+}
+.mrgin-5{
+  margin: 5px;
+}
+.mrgin-1 {
+  margin: 10px;
+}
+
+.mrgin-2 {
+  margin: 20px;
+}
+
+.m-top-5 {
+  margin-top: 5px;
+}
+
+.m-top-10 {
+  margin-top: 10px;
+}
+.m-top-20 {
+  margin-top: 20px;
+}
+
+.m-btn-10 {
+  margin-bottom: 10px;
+}
+
+.m-btn-15 {
+  margin-bottom: 15px;
+}
+.mr-1{
+  margin-right: 10px;
+}
+.mr-2{
+  margin-right: 20px;
+}
+.mr-3{
+  margin-right: 30px;
+}
+.ml-1{
+  margin-left: 10px;
+}
+.ml-2{
+  margin-left: 20px;
+}
+.ml-3{
+  margin-left: 30px;
+}
+.mb-2{
+  margin-bottom: 20px;
+}

+ 146 - 0
src/views/application/form/add.vue

@@ -0,0 +1,146 @@
+<template>
+    <div>
+        <div class="g-card">
+            <el-form ref="LotteryAdd" :model="addForm" :rules="addRules" label-position="left">
+                <el-form-item label="活动名称" prop="actName">
+                    <el-input v-model="addForm.actName" placeholder="请输入活动名称"></el-input>
+                </el-form-item>
+                <el-form-item label="活动时间" prop="actTime">
+                    <el-date-picker
+                        type="datetimerange"
+                        v-model="addForm.actTime"
+                        range-separator="至"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期"
+                        align="right"
+                        value-format="yyyy-MM-dd hh:mm:ss"
+                    ></el-date-picker>
+                </el-form-item>
+                <el-form-item label="活动描述" prop="actDesc">
+                    <el-input v-model="addForm.actDesc" placeholder="请输入活动描述"></el-input>
+                </el-form-item>
+                <el-form-item label="表单内容" prop="actPrizeList">
+                    <div style="display: flex;">
+                        <div style="width: 100%">
+                            <div v-for="(item, index) in addForm.actPrizeList" style="margin-top: 10px;">
+                                <el-input v-model="item.fieldName" placeholder="请输入字段名称" style="margin-right: 10px;"></el-input>
+                                <el-input v-model="item.fieldValue" placeholder="请输入填写内容"></el-input>
+                                <i class="el-icon-circle-close" style="cursor:pointer; margin-left: 10px;" @click="handleDel(item,index)"></i>
+                            </div>
+                            <el-button type="text" @click="handleAdd">新增字段</el-button>
+                        </div>
+                    </div>
+                </el-form-item>
+                <el-form-item label="活动图片" prop="fileUrl">
+                    <UploadToCos :fileUrl.sync="addForm.fileUrl" type="0" >
+                        <div slot="tip">支持jpg/jpeg/png格式,建议采用‌750x1000px</div>
+                    </UploadToCos>
+                </el-form-item>
+            </el-form>
+        </div>
+        <div class="g-footer-sticky" style="text-align: center;">
+            <el-button plain @click="$router.go(-1)">取消</el-button>
+            <el-button type="primary" @click="handleSubmit">提交</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import * as api from "@/api/lottery";
+
+export default {
+    name: "formAdd",
+    data() {
+        return {
+            addForm: {
+                actName: '',
+                actTime: [],
+                actDesc: '',
+                actPrizeList: [],
+                fileUrl: ''
+            },
+            addRules: {
+                actName:[ { required: true, message: '请输入活动名称', trigger: 'blur' } ]
+            }
+        }
+    },
+    created() {
+        if(this.$route.query.id) {
+            this.title = '编辑'
+            this.getActivity()
+        }
+    },
+    methods: {
+        getActivity() {
+            api.getActivity({
+                actId: this.$route.query.id
+            }).then(res => {
+                if(res.code == 200) {
+                    let obj = {...res.data}
+                    this.addForm = {
+                        actName: obj.actName,
+                        actType: `${obj.actType}`,
+                        actTime: [obj.actStartTime, obj.actEndTime],
+                        actDesc: obj.actDesc,
+                        actPrizeList: obj.fieldList?obj.fieldList:[],
+                        fileUrl: obj.fileUrl
+                    }
+                }
+            })
+        },
+        handleAdd() {
+            this.addForm.actPrizeList.push({
+                prizeName: '',
+                prizeContent: ''
+            })
+        },
+        handleDel( item, index ) {
+            this.addForm.actPrizeList.splice(index, 1)
+        },
+        async handleSubmit() {
+            let params = {
+                actName: this.addForm.actName,
+                actType: '4',
+                actDesc: this.addForm.actDesc,
+                actStartTime: this.addForm.actTime[0],
+                actEndTime: this.addForm.actTime[1],
+                actPrizeList: this.addForm.actPrizeList,
+                fileUrl: this.addForm.fileUrl
+            }
+            if(this.$route.query.id) {
+                api.editActivity({
+                    actId: this.$route.query.id,
+                    ...params
+                }).then(res => {
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            } else {
+                api.add({...params}).then(res => {
+                    console.log(123123, res)
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            }
+        }
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 223 - 0
src/views/application/form/list.vue

@@ -0,0 +1,223 @@
+<template>
+    <div>
+        <el-form ref="QueryForm" :inline="true" :model="queryForm" class="top-search">
+            <el-form-item label="活动名称" prop="type">
+                <el-input v-model="queryForm.actName" placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item label="">
+                <el-button type="primary" :loading="loading" @click="initList">查询</el-button>
+            </el-form-item>
+        </el-form>
+        <div class="g-card">
+            <div class="mid-action">
+                <el-button type="primary" @click="addForm">新增活动</el-button>
+            </div>
+            <el-table
+                :data="tableData"
+            >
+                <el-table-column type="index" label="序号" width="55"></el-table-column>
+                <el-table-column prop="actName" label="活动名称"></el-table-column>
+                <el-table-column prop="createTime" label="新建时间"></el-table-column>
+                <el-table-column label="活动时间">
+                    <template slot-scope="scope">
+                        {{ `${scope.row.actStartTime}-${scope.row.actEndTime}` }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="actDesc" label="活动规则"></el-table-column>
+                <el-table-column prop="listNum" label="收集数量">
+                    <template slot-scope="scope">
+                        <el-button type="text" @click="showNumber(scope.row)">{{ scope.row.listNum }}</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="actStatus" label="状态">
+                    <template slot-scope="scope">
+                        {{ scope.row.actStatus == '1'?'开启':scope.row.actStatus == '2'?'关闭':'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="updateBy" label="操作人"></el-table-column>
+                <el-table-column label="操作" width="200">
+                    <template slot-scope="scope">
+                        <el-button type="text" @click="handleClose(scope.row)">关闭</el-button>
+                        <el-button type="text" @click="handleStart(scope.row)">开启</el-button>
+                        <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+                        <el-button type="text" @click="handleShare(scope.row)">转发企微</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                v-show="total > 0"
+                :total="total"
+                :page.sync="queryForm.pageNum"
+                :limit.sync="queryForm.pageSize"
+                @pagination="initList"
+            />
+        </div>
+        <el-dialog
+            :visible.sync="numberShow"
+            width="400"
+        >
+            <el-form :model="viewForm">
+                <el-form-item prop="userInfo" label="用户信息">
+                    <el-input placeholder="请输入用户信息" v-model="viewForm.userInfo"></el-input>
+                    <el-button @click="viewSearch()" type="primary" style="margin-left: 10px;">搜索</el-button>
+                </el-form-item>
+            </el-form>
+            <div class="mid-action">
+                <el-button type="primary" @click="addDownoad">导出</el-button>
+            </div>
+            <el-table
+                :data="numbersData"
+            >
+                <el-table-column label="序号" type="index"></el-table-column>
+                <el-table-column label="用户ID" prop="userId"></el-table-column>
+                <el-table-column label="填写信息" prop="userInfo"></el-table-column>
+            </el-table>
+            <pagination
+                v-show="total1 > 0"
+                :total="total1"
+                :page.sync="viewForm.pageNum"
+                :limit.sync="viewForm.pageSize"
+                @pagination="initViewList"
+            />
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import * as api from "@/api/lottery";
+import {getFormRecord} from "@/api/lottery";
+
+export default {
+    name: "formList",
+    data() {
+        return {
+            queryForm: {
+                actName: '',
+                pageNum: 1,
+                pageSize: 10
+            },
+            total: 1,
+            loading: false,
+            tableData: [],
+            numberShow: false,
+            numbersData: [],
+            viewForm: {
+                userInfo: '',
+                pageNum: 1,
+                pageSize: 10
+            },
+            total1: 0,
+            viewId: ''
+        }
+    },
+    created() {
+        this.initList();
+    },
+    methods: {
+        initList() {
+            api.listActivity({
+                actTypeList: ['4'],
+                ...this.queryForm
+            }).then(res => {
+                this.loading = false
+                if(res.code == 200) {
+                    this.tableData = res.rows
+                    this.total = Number(res.total)
+                } else {
+                    this.tableData = []
+                    this.total = 0
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        addForm() {
+            this.$router.push({
+                path: 'add'
+            })
+        },
+        showNumber(row) {
+            this.numberShow = true
+            this.viewId = row.actId
+            this.initViewList()
+        },
+        initViewList() {
+            api.getFormRecord({
+                actId: this.viewId
+            }).then(res => {
+                if(res.code == 200) {
+                    this.numbersData = res.rows
+                    this.total1 = res.total
+                }
+            })
+        },
+        viewSearch() {
+            this.initViewList()
+        },
+        addDownoad() {
+            api.exportRedEnvelopeRecord({
+                actId: this.viewId
+            }).then(res => {
+                const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
+                const fileName = '表单活动' + new Date().getTime() + '.xlsx';
+                if ('download' in document.createElement('a')) {
+                    const elink = document.createElement('a');
+                    elink.download = fileName;
+                    elink.style.display = 'none';
+                    elink.href = URL.createObjectURL(blob);
+                    document.body.appendChild(elink);
+                    elink.click();
+                    URL.revokeObjectURL(elink.href);
+                    document.body.removeChild(elink);
+                } else {
+                    navigator.msSaveBlob(blob, fileName);
+                }
+            })
+        },
+        handleClose(row) {
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 2
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        handleStart(row) {
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 1
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        handleEdit(row) {
+            this.$router.push({
+                path: `add?id=${row.actId}`
+            })
+        },
+        handleShare(row) {
+            let inputs=document.createElement("input")     //创建节点
+            inputs.value = `https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=packageB/pages/activity/act-landing.html?activityId=${row.actId}&env_version=develop#wechat-redirect`//给节点赋值
+            document.body.appendChild(inputs) //渲染节点(要不然不起作用,可以添加隐藏属性)
+            inputs.select() //选中节点
+            let  actions =  document.execCommand("Copy") //指定复制命令(返回的是一个boolean类型)
+            if(actions) {
+                this.$message.success('复制成功!')
+            }
+        }
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 220 - 41
src/views/application/lottery/add.vue

@@ -3,81 +3,260 @@
         <div class="g-card">
             <h4 class="g-card-title">{{ title }}</h4>
             <el-form ref="LotteryAdd" :model="addForm" :rules="addRules" label-position="left">
-                <el-form-item label="活动名称" prop="a">
-                    <el-input v-model="addForm.a" placeholder="请输入活动名称"></el-input>
+                <el-form-item label="活动名称" prop="actName">
+                    <el-input v-model="addForm.actName" placeholder="请输入活动名称"></el-input>
                 </el-form-item>
-                <el-form-item label="活动类型" prop="b">
-                    <el-select v-model="addForm.b" placeholder="请选择活动类型">
+                <el-form-item label="活动类型" prop="actType">
+                    <el-select v-model="addForm.actType" placeholder="请选择活动类型">
                         <el-option value="1" label="抽奖"></el-option>
-                        <el-option value="2" label="红包"></el-option>
+                        <el-option value="2" label="转盘"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="活动时间" prop="c">
+                <el-form-item label="活动时间" prop="actTime">
                     <el-date-picker
-                        type="daterange"
-                        v-model="addForm.c"
+                        type="datetimerange"
+                        v-model="addForm.actTime"
                         range-separator="至"
                         start-placeholder="开始日期"
                         end-placeholder="结束日期"
                         align="right"
-                        value-format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd hh:mm:ss"
                     ></el-date-picker>
                 </el-form-item>
-                <el-form-item label="奖品设置" prop="d">
-                    <el-radio-group v-model="addForm.d" v-if="addForm.b ==='2' ">
-                        <el-radio label="1">单等级奖品</el-radio>
-                        <el-radio label="2">多等级奖品</el-radio>
-                    </el-radio-group>
-                    <el-input v-model="addForm.d" v-else-if="addForm.b === '1' "></el-input>
+                <el-form-item label="奖品设置" prop="actPrizeSet">
+                    <el-button type="primary" @click="addPrize">新增</el-button>
                 </el-form-item>
-                <el-form-item label="奖品等级" v-if="addForm.d === '2' ">
-                    <el-select v-model="addForm.e" placeholder="请选择奖品等级">
-                        <el-option value="1" label="等级1"></el-option>
-                    </el-select>
+                <el-table
+                    :data="addForm.prizeList"
+                >
+                    <el-table-column prop="prizeName" label="奖品名称"></el-table-column>
+                    <el-table-column prop="winPercent" label="奖品概率"></el-table-column>
+                    <el-table-column prop="prizeNum" label="奖品数量"></el-table-column>
+                    <el-table-column prop="prizeType" label="活动奖品">
+                        <template slot-scope="scope">
+                            {{ scope.row.prizeType == 1? '优惠券':scope.row.prizeType == 2? '积分':scope.row.prizeType == 3? '平台会员':scope.row.prizeType == 5? '':'谢谢参与' }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作">
+                        <template slot-scope="scope">
+                            <el-button type="text" @click="prizeEdit(scope)">编辑</el-button>
+                            <el-button type="text" @click="prizeDel(scope)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-form>
+        </div>
+        <div class="g-footer-sticky" style="text-align: center;">
+            <el-button plain @click="$router.go(-1)">取消</el-button>
+            <el-button type="primary" @click="handleSubmit">提交</el-button>
+        </div>
+        <el-dialog
+            :visible.sync="addPrizeShow"
+            width="600"
+        >
+            <el-form :model="addPrizeForm" label-position="left">
+                <el-form-item prop="prizeName" label="奖品名称">
+                    <el-input v-model="addPrizeForm.prizeName" placeholder="请输入奖品名称"></el-input>
                 </el-form-item>
-                <el-form-item label="活动奖品" prop="f">
-                    <el-radio-group v-model="addForm.f">
-                        <el-radio label="1">优惠券</el-radio>
-                        <el-radio label="2">积分</el-radio>
-                        <el-radio label="3">平台会员</el-radio>
-                    </el-radio-group>
+                <el-form-item prop="winPercent" label="奖品概率">
+                    <el-input v-model="addPrizeForm.winPercent" placeholder="请输入奖品概率"></el-input>
                 </el-form-item>
-                <el-form-item label="" prop="g">
-                    <el-select v-model="addForm.g" filterable v-if="addForm.f === '1' ">
-                        <el-option label="选项1" value="1"></el-option>
-                    </el-select>
-                    <el-input v-else-if="addForm.f === '2' || addForm.f === '3'" v-model="addForm.g" :placeholder="addForm.f === '2'?'请输入积分':addForm.f === '3'?'请输入天数':''"></el-input>
+                <el-form-item prop="prizeNum" label="奖品数量">
+                    <el-input v-model="addPrizeForm.prizeNum" placeholder="请输入奖品数量"></el-input>
+                </el-form-item>
+                <el-form-item label="活动奖品">
+                    <div style="display: flex">
+                        <div style="width: 100%">
+                            <div>
+                                <el-radio-group v-model="addPrizeForm.prizeType">
+                                    <el-radio label="1">优惠券</el-radio>
+                                    <el-radio label="2">积分</el-radio>
+                                    <el-radio label="3">平台会员</el-radio>
+                                    <el-radio label="5">谢谢参与</el-radio>
+                                </el-radio-group>
+                            </div>
+                            <div v-if="addPrizeForm.prizeType === '1' ">
+                                <el-select v-model="addPrizeForm.prizeContent" filterable placeholder="请选择优惠券">
+                                    <el-option :label="item.rightsName" :value="item.id" v-for="(item, index) in coupon" :key="item.id"></el-option>
+                                </el-select>
+                            </div>
+                            <div v-else-if="addPrizeForm.prizeType === '2'">
+                                <el-input v-model="addPrizeForm.prizeContent" :placeholder="addPrizeForm.prizeType === '2'?'请输入积分':addPrizeForm.prizeType === '3'?'请输入天数':''"></el-input>
+                            </div>
+                        </div>
+                    </div>
                 </el-form-item>
             </el-form>
-        </div>
+            <template #footer>
+                <el-button plain @click="addPrizeCancel">取消</el-button>
+                <el-button type="primary" @click="addPrizeSubmit">提交</el-button>
+            </template>
+        </el-dialog>
     </div>
 </template>
 
 <script>
+import * as api from '@/api/lottery'
+import {getEquityCoupon} from "@/api/lottery";
 export default {
     name: "lotteryAdd",
     data() {
         return {
             title: '新增',
             addForm: {
-                a: '',
-                b: '2',
-                c: '',
-                d: '1',
-                e: '',
-                f: '',
-                g: '1'
+                actName: '',
+                actType: '1',
+                actTime: [],
+                prizeList: []
             },
             addRules: {
-                a: [{ required: true, message: '请输入活动名称', trigger: 'blur' }]
-            }
+                actName: [ { required: true, message: '请输入活动名称', trigger: 'blur' } ],
+                actType: [ { required: true, message: '请选择活动类型', trigger: 'change' } ],
+                actTime: [ { required: true, message: '请选择活动时间', trigger: 'change' } ],
+                actPrizeSet: [ { required: true, message: '请选择活动设置', trigger: 'change' } ]
+            },
+            addPrizeShow: false,
+            addPrizeForm: {
+                prizeName: '',
+                winPercent: '',
+                prizeNum: 0,
+                prizeType: '1',
+                prizeContent: ''
+            },
+            coupon: [],
+            isEdit: false,
+            editIndex: null
         }
     },
     created() {
-
+        this.isEdit = false
+        if(this.$route.query.id) {
+            this.title = '编辑'
+            this.isEdit = true
+            this.getActivity()
+        }
+        this.getEquityCoupon();
     },
     methods: {
+        getEquityCoupon() {
+            api.getEquityCoupon().then(res => {
+                if(res.code == 200) {
+                    this.coupon = res.data
+                }
+            })
+        },
+        getActivity() {
+            api.getActivity({
+                actId: this.$route.query.id
+            }).then(res => {
+                if(res.code == 200) {
+                    let obj = {...res.data}
+                    this.addForm = {
+                        actName: obj.actName,
+                        actType: `${obj.actType}`,
+                        actTime: [obj.actStartTime, obj.actEndTime],
+                        actPrizeSet: `${obj.actPrizeSet}`,
+                        prizeList: obj.prizeList?obj.prizeList:[]
+                    }
+                }
+            })
+        },
+        addPrize() {
+            if(this.addForm.actType == '1') {
+                if(this.addForm.prizeList&&this.addForm.prizeList.length>=8) {
+                    this.$message.error('活动类型为抽奖时,奖品设置数量最多为8条!')
+                    return
+                }
+            } else if(this.addForm.actType == '2') {
+                if(this.addForm.prizeList&&this.addForm.prizeList.length>=6) {
+                    this.$message.error('活动类型为转盘时,奖品设置数量最多为6条!')
+                    return
+                }
+            }
+            this.isEdit = false
+            this.addPrizeShow = true
+            let num = 0
+            this.addForm.prizeList.forEach(item => {
+                num += Number(item.winPercent)
+            })
+            this.addPrizeForm = {
+                prizeName: '',
+                winPercent: 100 - num,
+                prizeNum: 0,
+                prizeType: '1',
+                prizeContent: ''
+            }
+        },
+        prizeEdit(scope) {
+            this.addPrizeShow = true
+            this.addPrizeForm = scope.row
+            this.isEdit = true
+            this.editIndex = scope.$index
+        },
+        prizeDel(scope) {
+            this.addForm.prizeList.splice(scope.$index, 1)
+        },
+        addPrizeCancel() {
+            this.addPrizeShow = false
+            this.addPrizeForm = {
+                prizeName: '',
+                winPercent: '',
+                prizeNum: 0,
+                prizeType: '1',
+                prizeContent: ''
+            }
+        },
+        addPrizeSubmit() {
+            this.addPrizeShow = false
+            if(this.isEdit) {
 
+            } else {
+                this.addForm.prizeList.push({
+                    ...this.addPrizeForm
+                })
+            }
+        },
+        handleSubmit() {
+            this.addForm.prizeList.forEach(item => {
+                item.prizeType = `${item.prizeType}`
+            })
+            let params = {
+                actName: this.addForm.actName,
+                actType: this.addForm.actType,
+                actStartTime: this.addForm.actTime[0],
+                actEndTime: this.addForm.actTime[1],
+                actPrizeList: this.addForm.prizeList,
+            }
+            if(this.$route.query.id) {
+                api.editActivity({
+                    actId: this.$route.query.id,
+                    ...params
+                }).then(res => {
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            } else {
+                api.add({...params}).then(res => {
+                    console.log(123123, res)
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            }
+        }
     },
 }
 </script>

+ 140 - 22
src/views/application/lottery/list.vue

@@ -2,29 +2,48 @@
     <div>
         <el-form ref="LotteryForm" :inline="true" :model="lotteryForm" class="top-search">
             <el-form-item label="类型" prop="type">
-                <el-select v-model="lotteryForm.type">
-                    <el-option value="1" label="1"></el-option>
+                <el-select v-model="lotteryForm.actType" clearable>
+                    <el-option value="1" label="抽奖"></el-option>
+                    <el-option value="2" label="转盘"></el-option>
                 </el-select>
             </el-form-item>
             <el-form-item label="">
                 <el-button type="primary" :loading="loading" @click="initList">查询</el-button>
-                <el-button type="primary" icon="el-icon-plus" @click="addLottery" style="background: #fa7216; color: #ffffff; border-color: #fa7216;">新增活动</el-button>
             </el-form-item>
         </el-form>
         <div class="g-card">
+            <div class="mid-action">
+                <el-button type="primary" @click="addLottery">新增活动</el-button>
+            </div>
             <el-table
                 :data="tableData"
             >
-                <el-table-column type="index" width="55"></el-table-column>
-                <el-table-column prop="a" label="活动名称"></el-table-column>
-                <el-table-column prop="a" label="新建时间"></el-table-column>
-                <el-table-column prop="a" label="活动类型"></el-table-column>
+                <el-table-column type="index" label="序号" width="55"></el-table-column>
+                <el-table-column prop="actName" label="活动名称"></el-table-column>
+                <el-table-column prop="createTime" label="新建时间"></el-table-column>
+                <el-table-column prop="actType" label="活动类型">
+                    <template slot-scope="scope">
+                        {{ scope.row.actType == '1'?'抽奖':scope.row.actType == '2'?'转盘':'' }}
+                    </template>
+                </el-table-column>
                 <el-table-column prop="a" label="奖品"></el-table-column>
                 <el-table-column prop="a" label="参与用户"></el-table-column>
-                <el-table-column prop="a" label="活动时间"></el-table-column>
-                <el-table-column prop="a" label="中奖人数"></el-table-column>
-                <el-table-column prop="a" label="状态"></el-table-column>
-                <el-table-column prop="a" label="操作人"></el-table-column>
+                <el-table-column label="活动时间" width="160">
+                    <template slot-scope="scope">
+                        {{ scope.row.actStartTime&&scope.row.actEndTime?`${scope.row.actStartTime}-${scope.row.actEndTime}`:'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="winNum" label="中奖人数">
+                    <template slot-scope="scope">
+                        <el-button type="text" @click="showNumber(scope.row)">{{ scope.row.winNum?scope.row.winNum:0 }}</el-button>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="actStatus" label="状态">
+                    <template slot-scope="scope">
+                        {{ scope.row.actStatus == '1'?'开启':scope.row.actStatus == '2'?'关闭':'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="updateBy" label="操作人"></el-table-column>
                 <el-table-column label="操作" width="200">
                     <template slot-scope="scope">
                         <el-button type="text" @click="handleClose(scope.row)">关闭</el-button>
@@ -34,48 +53,147 @@
                     </template>
                 </el-table-column>
             </el-table>
+            <pagination
+                v-show="total > 0"
+                :total="total"
+                :page.sync="lotteryForm.pageNum"
+                :limit.sync="lotteryForm.pageSize"
+                @pagination="initList"
+            />
         </div>
+        <el-dialog
+            :visible.sync="numberShow"
+            width="400"
+        >
+            <el-table
+                :data="numbersData"
+            >
+                <el-table-column label="序号" type="index"></el-table-column>
+                <el-table-column label="用户名称" prop="userNickName"></el-table-column>
+                <el-table-column label="手机号" prop="userPhone"></el-table-column>
+            </el-table>
+        </el-dialog>
+        <pagination
+            v-show="total1 > 0"
+            :total="total1"
+            :page.sync="numberForm.pageNum"
+            :limit.sync="numberForm.pageSize"
+            @pagination="getWinningRecord"
+        />
     </div>
 </template>
 
 <script>
-import * as api from '@/api/task'
+import * as api from '@/api/lottery'
+import {getWinningRecord} from "@/api/lottery";
 export default {
     name: "lotteryList",
     data() {
         return {
             lotteryForm: {
-                type: ''
+                actType: '',
+                pageNum: 1,
+                pageSize: 10
             },
+            total: 1,
             loading: false,
-            tableData: [{
-                a: 1
-            }]
+            tableData: [],
+            numberShow: false,
+            numbersData: [],
+            total1: 0,
+            numberForm: {
+                pageNum: 1,
+                pageSize: 10
+            },
+            numberId: ''
         }
     },
     created() {
-
+        this.initList();
     },
     methods: {
         initList() {
-
+            this.loading = true
+            api.listActivity({
+                actTypeList: this.lotteryForm.actType?[this.lotteryForm.actType]:['1','2'],
+                pageNum: this.lotteryForm.pageNum,
+                pageSize: this.lotteryForm.pageSize
+            }).then(res => {
+                this.loading = false
+                if(res.code == 200) {
+                    this.tableData = res.rows
+                    this.total = Number(res.total)
+                } else {
+                    this.tableData = []
+                    this.total = 0
+                    this.$message.error(res.msg)
+                }
+            })
         },
         addLottery() {
             this.$router.push({
                 path: 'add'
             })
         },
+        showNumber(row) {
+            // if(row.winNum) {
+            //     this.numberShow = true
+            // }
+            this.numberShow = true
+            this.numberId = row.actId
+            this.getWinningRecord()
+        },
+        getWinningRecord() {
+            api.getWinningRecord({
+                actId: this.numberId,
+                ...this.numberForm
+            }).then(res => {
+                if(res.code == 200) {
+                    this.numbersData = res.rows
+                    this.total1 = res.total
+                }
+            })
+        },
         handleClose(row) {
-
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 2
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
         },
         handleStart(row) {
-
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 1
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
         },
         handleEdit(row) {
-
+            this.$router.push({
+                path: `add?id=${row.actId}`
+            })
         },
         handleShare(row) {
-
+            let inputs=document.createElement("input")     //创建节点
+            inputs.value = row.actType == 1?`https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=packageB/pages/activity/act-nineGrid.html?activityId=${row.actId}&env_version=develop#wechat-redirect`: row.actType == 2?`https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=packageB/pages/activity/act-wheel.html?activityId=${row.actId}&env_version=develop#wechat-redirect`: '' //给节点赋值
+            document.body.appendChild(inputs) //渲染节点(要不然不起作用,可以添加隐藏属性)
+            inputs.select() //选中节点
+            let  actions =  document.execCommand("Copy") //指定复制命令(返回的是一个boolean类型)
+            if(actions) {
+                this.$message.success('复制成功!')
+            }
         }
     }
 }

+ 156 - 0
src/views/application/packet/add.vue

@@ -0,0 +1,156 @@
+<template>
+    <div>
+        <div class="g-card">
+            <h4 class="g-card-title">{{ title }}</h4>
+            <el-form ref="PacketAdd" :model="addForm" :rules="addRules" label-position="left">
+                <el-form-item label="活动名称" prop="actName">
+                    <el-input v-model="addForm.actName" placeholder="请输入活动名称"></el-input>
+                </el-form-item>
+                <el-form-item label="活动时间" prop="actTime">
+                    <el-date-picker
+                        type="datetimerange"
+                        v-model="addForm.actTime"
+                        range-separator="至"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期"
+                        align="right"
+                        value-format="yyyy-MM-dd hh:mm:ss"
+                    ></el-date-picker>
+                </el-form-item>
+                <el-form-item label="活动预算" prop="redRacketBudget">
+                    <el-input v-model="addForm.redRacketBudget" placeholder="请输入活动预算" @change="actBudgetChange"></el-input>
+                </el-form-item>
+                <el-form-item label="红包金额" prop="redRacketAmount">
+                    <el-input v-model="addForm.redRacketAmount" placeholder="请输入红包金额" @change="redRacketAmountChange"></el-input>
+                </el-form-item>
+                <el-form-item label="红包数量" prop="prizeNum">
+                    <el-input v-model="addForm.prizeNum" placeholder="请输入红包数量" @change="prizeNumChange"></el-input>
+                </el-form-item>
+                <el-form-item label="裂变规则" prop="redRacketRule">
+                    邀请 <el-input style="width: 100px;" v-model="addForm.redRacketRule" placeholder="请输入" type="number"></el-input> 新用户助力,即可获得红包
+                </el-form-item>
+            </el-form>
+        </div>
+        <div class="g-footer-sticky" style="text-align: center;">
+            <el-button plain @click="$router.go(-1)">取消</el-button>
+            <el-button type="primary" @click="handleSubmit">提交</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import * as api from "@/api/lottery";
+
+export default {
+    name: "packetAdd",
+    data() {
+        return {
+            title: '新增',
+            addForm: {
+                actName: '',
+                actTime: '',
+                redRacketBudget: '',
+                redRacketAmount: '',
+                prizeNum: '',
+                redRacketRule: '',
+            },
+            addRules: {
+                actName: [{ required: true, message: '请输入活动名称', trigger: 'blur' }],
+                prizeNum: [
+                    {
+                        pattern: /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/,
+                        required: false,
+                        message: '请输入数量,且为正整数类型',
+                        trigger: 'blur'
+                    }
+                ]
+            }
+        }
+    },
+    created() {
+        if(this.$route.query.id) {
+            this.title = '编辑'
+            this.getActivity()
+        }
+    },
+    methods: {
+        getActivity() {
+            api.getActivity({
+                actId: this.$route.query.id
+            }).then(res => {
+                if(res.code == 200) {
+                    let obj = {...res.data}
+                    this.addForm = {
+                        actName: obj.actName,
+                        actType: `${obj.actType}`,
+                        actTime: [obj.actStartTime, obj.actEndTime],
+                        redRacketBudget: obj.prizeList?.[0].redRacketBudget,
+                        redRacketAmount: obj.prizeList?.[0].redRacketAmount,
+                        prizeNum: obj.prizeList?.[0].prizeNum,
+                        redRacketRule: obj.prizeList?.[0].redRacketRules
+                    }
+                }
+            })
+        },
+        actBudgetChange(e) {
+
+        },
+        redRacketAmountChange(e) {
+
+        },
+        prizeNumChange(e) {
+
+        },
+        handleSubmit() {
+            let params = {
+                actName: this.addForm.actName,
+                actType: '3',
+                actStartTime: this.addForm.actTime[0],
+                actEndTime: this.addForm.actTime[1],
+                actPrizeList: [
+                    {
+                        redRacketBudget: this.addForm.redRacketBudget,
+                        redRacketAmount: this.addForm.redRacketAmount,
+                        prizeNum: this.addForm.prizeNum,
+                        redRacketRule: this.addForm.redRacketRule,
+                        prizeType: '4'
+                    }
+                ]
+            }
+            if(this.$route.query.id) {
+                api.editActivity({
+                    actId: this.$route.query.id,
+                    ...params
+                }).then(res => {
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            } else {
+                api.add({...params}).then(res => {
+                    console.log(123123, res)
+                    if(res.code == 200) {
+                        this.$message({
+                            message: res.msg,
+                            type: 'success'
+                        })
+                        this.$router.push({
+                            path: 'list'
+                        })
+                    }
+                })
+            }
+        }
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 243 - 0
src/views/application/packet/list.vue

@@ -0,0 +1,243 @@
+<template>
+    <div>
+        <el-form ref="LotteryForm" :inline="true" :model="packetForm" class="top-search">
+            <el-form-item label="活动名称" prop="type">
+                <el-input v-model="packetForm.actName" placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item label="">
+                <el-button type="primary" :loading="loading" @click="initList">查询</el-button>
+            </el-form-item>
+        </el-form>
+        <div class="g-card">
+            <div class="mid-action">
+                <el-button type="primary" @click="addPacket">新增活动</el-button>
+            </div>
+            <el-table
+                :data="tableData"
+            >
+                <el-table-column type="index" label="序号" width="55"></el-table-column>
+                <el-table-column prop="actName" label="活动名称"></el-table-column>
+                <el-table-column prop="createTime" label="创建时间"></el-table-column>
+                <el-table-column prop="redRacketAmount" label="红包金额">
+                    <template slot-scope="scope">
+                        {{ scope.row.prizeList?scope.row.prizeList[0].redRacketAmount:'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="prizeNum" label="红包数量">
+                    <template slot-scope="scope">
+                        {{ scope.row.prizeList?scope.row.prizeList[0].prizeNum:'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="redRacketRules" label="裂变规则">
+                    <template slot-scope="scope">
+                        {{ scope.row.prizeList?scope.row.prizeList[0].redRacketRules:'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="活动时间">
+                    <template slot-scope="scope">
+                        {{ `${scope.row.actStartTime}-${scope.row.actEndTime}` }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="redRacketBudget" label="活动预算">
+                    <template slot-scope="scope">
+                        {{ scope.row.prizeList?scope.row.prizeList[0].redRacketBudget:'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="listNum" label="参与用户"></el-table-column>
+                <el-table-column prop="actStatus" label="状态">
+                    <template slot-scope="scope">
+                        {{ scope.row.actStatus == '1'?'开启':scope.row.actStatus == '2'?'关闭':'' }}
+                    </template>
+                </el-table-column>
+                <el-table-column prop="updateBy" label="操作人"></el-table-column>
+                <el-table-column label="操作" width="200">
+                    <template slot-scope="scope">
+                        <el-button type="text" @click="handleClose(scope.row)">关闭</el-button>
+                        <el-button type="text" @click="handleStart(scope.row)">开启</el-button>
+                        <el-button type="text" @click="handleView(scope.row)">查看</el-button>
+                        <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+                        <el-button type="text" @click="handleShare(scope.row)">转发企微</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                v-show="total > 0"
+                :total="total"
+                :page.sync="packetForm.pageNum"
+                :limit.sync="packetForm.pageSize"
+                @pagination="initList"
+            />
+        </div>
+        <el-dialog
+            :visible.sync="viewShow"
+            width="500"
+        >
+            <el-form :model="viewForm">
+                <el-form-item prop="userInfo" label="用户信息">
+                    <el-input placeholder="请输入用户信息" v-model="viewForm.userInfo"></el-input>
+                    <el-button @click="viewSearch()" type="primary" style="margin-left: 10px;">搜索</el-button>
+                </el-form-item>
+            </el-form>
+            <div class="mid-action">
+                <el-button type="primary" @click="addDownoad">导出</el-button>
+            </div>
+            <el-table
+                :data="viewData"
+            >
+                <el-table-column type="index" label="序号"></el-table-column>
+                <el-table-column prop="userNickName" label="发起用户"></el-table-column>
+                <el-table-column prop="money" label="红包金额"></el-table-column>
+                <el-table-column label="裂变用户">
+                    <template slot-scope="scope">
+                        {{ `${scope.row.helpUserNickName} - ${scope.row.helpUserPhone}` }}
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                v-show="total1 > 0"
+                :total="total1"
+                :page.sync="viewForm.pageNum"
+                :limit.sync="viewForm.pageSize"
+                @pagination="initViewList"
+            />
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import * as api from '@/api/lottery'
+import {exportRedEnvelopeRecord} from "@/api/lottery";
+
+export default {
+    name: "packetList",
+    data() {
+        return {
+            packetForm: {
+                actName: '',
+                pageNum: 1,
+                pageSize: 10
+            },
+            total: 0,
+            total1: 0,
+            viewForm: {
+                userInfo: '',
+                pageNum: 1,
+                pageSize: 10,
+            },
+            loading: false,
+            tableData: [],
+            viewShow: false,
+            viewData: [],
+            viewId: ''
+        }
+    },
+    created() {
+        this.initList();
+    },
+    methods: {
+        initList() {
+            api.listActivity({
+                actTypeList: ['3'],
+                ...this.packetForm
+            }).then(res => {
+                this.loading = false
+                if(res.code == 200) {
+                    this.tableData = res.rows
+                    this.total = Number(res.total)
+                } else {
+                    this.tableData = []
+                    this.total = 0
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        addPacket() {
+            this.$router.push({
+                path: 'add'
+            })
+        },
+        handleClose(row) {
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 2
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        handleStart(row) {
+            api.editActivityStatus({
+                actId: row.actId,
+                actStatus: 1
+            }).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.initList()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        },
+        handleEdit(row) {
+            this.$router.push({
+                path: `add?id=${row.actId}`
+            })
+        },
+        handleView(row) {
+            this.viewShow = true
+            this.viewId = row.actId
+            this.initViewList()
+        },
+        handleShare(row) {
+            let inputs=document.createElement("input")     //创建节点
+            inputs.value = `https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=packageB/pages/activity/act-assist.html?activityId=${row.actId}&env_version=develop#wechat-redirect`//给节点赋值
+            document.body.appendChild(inputs) //渲染节点(要不然不起作用,可以添加隐藏属性)
+            inputs.select() //选中节点
+            let  actions =  document.execCommand("Copy") //指定复制命令(返回的是一个boolean类型)
+            if(actions) {
+                this.$message.success('复制成功!')
+            }
+        },
+        viewSearch() {
+            this.initViewList()
+        },
+        initViewList() {
+            api.getRedEnvelopeRecord({
+                actId: this.viewId,
+                ...this.viewForm
+            }).then(res => {
+                this.total1 = res.total
+                this.viewData = res.rows
+            })
+        },
+        addDownoad() {
+            api.exportRedEnvelopeRecord({
+                actId: this.viewId
+            }).then(res => {
+                const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
+                const fileName = '红包记录' + new Date().getTime() + '.xlsx';
+                if ('download' in document.createElement('a')) {
+                    const elink = document.createElement('a');
+                    elink.download = fileName;
+                    elink.style.display = 'none';
+                    elink.href = URL.createObjectURL(blob);
+                    document.body.appendChild(elink);
+                    elink.click();
+                    URL.revokeObjectURL(elink.href);
+                    document.body.removeChild(elink);
+                } else {
+                    navigator.msSaveBlob(blob, fileName);
+                }
+            })
+        }
+    }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 6 - 7
src/views/carHfAllot/infoMsg/groupDetail.vue

@@ -196,7 +196,7 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
-           
+
             <el-col :span="24">
               <el-form-item label="回访内容" prop="hfmsg">
                 <el-input style="max-width: 100%" :autosize="{ minRows: 2 }" type="textarea" v-model="addEditForm.hfmsg"
@@ -239,7 +239,6 @@
 import {
   addEditHf,
   getHfList,
-  oneRenewal,
   dictSelect,
   deleteRow,
 } from "@/api/carHfManage";
@@ -260,7 +259,7 @@ export default {
         ],
       },
 
-    
+
 
       getHfListData: [],
       getHfListList: [
@@ -425,7 +424,7 @@ export default {
           sypolicyno,
         };
       } else {
-      
+
         this.addOrEdit = "编辑";
         this.addEditForm = row;
       }
@@ -443,13 +442,13 @@ export default {
         type: "warning",
       })
         .then(() => {
-         
+
           deleteRow(scope.row.keyId).then((res) => {
             that.$message({
               type: "success",
               message: "删除成功!",
             });
-          
+
             that.querygetHfList();
           });
         })
@@ -476,7 +475,7 @@ export default {
           row.oldjqpolicyno || row.oldsypolicyno || row.proposalno || "",
 
         type: type,
-        policyno: row.oldjqpolicyno || row.oldsypolicyno 
+        policyno: row.oldjqpolicyno || row.oldsypolicyno
       };
 
       if (type == "Renewal" || type == "Update" || type == "Query") {

+ 6 - 7
src/views/carHfInfo/infoMsg/groupDetail.vue

@@ -185,7 +185,7 @@
                 <el-select v-model="addEditForm.status" placeholder="请选择" style="width: 100%" clearable>
                   <el-option v-for="(item, index) in statusList" :key="index" :label="item.dictvalue"
                     :value="item.dictcode"></el-option>
-                </el-select>  
+                </el-select>
               </el-form-item>
             </el-col>
 
@@ -196,7 +196,7 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
-           
+
             <el-col :span="24">
               <el-form-item label="回访内容" prop="hfmsg">
                 <el-input style="max-width: 100%" :autosize="{ minRows: 2 }" type="textarea" v-model="addEditForm.hfmsg"
@@ -239,7 +239,6 @@
 import {
   addEditHf,
   getHfList,
-  oneRenewal,
   dictSelect,
   deleteRow,
 } from "@/api/carHfManage";
@@ -260,7 +259,7 @@ export default {
         ],
       },
 
-    
+
 
       getHfListData: [],
       getHfListList: [
@@ -424,7 +423,7 @@ export default {
           sypolicyno,
         };
       } else {
-      
+
         this.addOrEdit = "编辑";
         this.addEditForm = row;
       }
@@ -442,13 +441,13 @@ export default {
         type: "warning",
       })
         .then(() => {
-         
+
           deleteRow(scope.row.keyId).then((res) => {
             that.$message({
               type: "success",
               message: "删除成功!",
             });
-          
+
             that.querygetHfList();
           });
         })

+ 7 - 8
src/views/carHfManage/infoMsg/groupDetail.vue

@@ -19,7 +19,7 @@
                   src="@/assets/drainageCode/zhengyan.png" />
               </div>
               <div v-else class="tuomin_appcontactphone">
-                <el-input :readonly="!!row.appcontactphone" :disabled="!row.appcontactphone" style="width: 70%;" 
+                <el-input :readonly="!!row.appcontactphone" :disabled="!row.appcontactphone" style="width: 70%;"
                   :value="row.appcontactphone.replace(/(\w{3})\w*(\w{4})/, '$1****$2')" placeholder="请输入客户电话" />
                 <img v-if="showFlag != '0'" @click="tuominFlag = !tuominFlag" class="tuomin_btn"
                   src="@/assets/drainageCode/biyan.png" />
@@ -196,7 +196,7 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
-           
+
             <el-col :span="24">
               <el-form-item label="回访内容" prop="hfmsg">
                 <el-input style="max-width: 100%" :autosize="{ minRows: 2 }" type="textarea" :readonly="!!addEditForm.hfmsg" :disabled="!addEditForm.hfmsg" v-model="addEditForm.hfmsg" placeholder="请输入内容">
@@ -238,7 +238,6 @@
 import {
   addEditHf,
   getHfList,
-  oneRenewal,
   dictSelect,
   deleteRow,
 } from "@/api/carHfManage";
@@ -259,7 +258,7 @@ export default {
         ],
       },
 
-    
+
 
       getHfListData: [],
       getHfListList: [
@@ -426,7 +425,7 @@ export default {
           sypolicyno,
         };
       } else {
-      
+
         this.addOrEdit = "编辑";
         this.addEditForm = row;
       }
@@ -444,13 +443,13 @@ export default {
         type: "warning",
       })
         .then(() => {
-         
+
           deleteRow(scope.row.keyId).then((res) => {
             that.$message({
               type: "success",
               message: "删除成功!",
             });
-          
+
             that.querygetHfList();
           });
         })
@@ -527,7 +526,7 @@ export default {
     queryDictionary() {
       const proArr = [];
       const list = [
-       
+
         "QW_HFTYPE",//状态
         "QW_HFSTATUS",//方式
 

+ 111 - 143
src/views/commodityCenter/commodityManage/detail.vue

@@ -1,161 +1,129 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form :model="form" disabled label-width="120px" label-position="right">
+      <div class="g-card">
+        <span class="g-card-title">商品详情页</span>
+          <el-form-item label="商品名称">
+              <el-input v-model="form.productName"></el-input>
+          </el-form-item>
+          <el-form-item label="商品类目">
+              <el-input v-model="form.categoryName"></el-input>
+          </el-form-item>
+          <el-form-item label="商品封面图">
+            <img class="formImage" :src="form.productImage">
+          </el-form-item>
+          <el-form-item label="上传视频">
+              <video
+                  ref="videoPlayer"
+                  id="video"
+                  class="video-js vjs-default-skin vjs-big-play-centered"
+                  controls
+                  webkit-playsinline="true"
+                  playsinline="true"
+                  :autoplay="false"
+                  preload="auto"
+              ></video>
+          </el-form-item>
+          <el-form-item label="商品详情描述">
+            <el-input type="textarea" v-model="form.instructions"></el-input>
+          </el-form-item>
+          <el-form-item label="组合套餐">
+            <div v-for="(item, index) in form.groupList">
+                <div class="topName">{{ item.productGroupTopName }}</div>
+                <div v-for="(sub, subIndex) in item.list">
+                    <div class="listItem">
+                        <span>{{ sub.productName }}</span>
+                        <span>{{ sub.quantity }}{{ sub.unit }}</span>
+                        <span>{{ `${sub.price}元` }}</span>
+                    </div>
+                </div>
+            </div>
+          </el-form-item>
+      </div>
+        <div class="g-card">
+            <span class="g-card-title">价格设定</span>
+            <el-form-item label="原价">
+                <el-input v-model="form.price"></el-input>
+            </el-form-item>
+            <el-form-item label="参考售价">
+                <el-input v-model="form.soldPrice"></el-input>
+            </el-form-item>
+        </div>
+    </el-form>
+  </div>
+</template>
+
+<!-- 行为区域 -->
 <script>
-import TimeSearchTitle from '@/components/common/TimeSearchTitle'
-import ChartLine from '@/components/ChartLine.vue'
-import * as api from '@/api/commodityCenter/commodityManage'
+import videojs from 'video.js'
+import 'video.js/dist/video-js.css';
+import axios from "axios";
+
 export default {
-  name: '',
-  components: { TimeSearchTitle, ChartLine },
+  // 数据存放区域
   data() {
     return {
-      loading: false,
-      list: [],
-      legend: ['订单总额', '退款总额', '净收入'],
-      xData: [],
-      series: [],
-      cardData: [],
-      active: 0,
-      api,
-      form: {
-        picture: '',
-        price: 1,
-        describe: '',
-        attachments: [],
-      },
+        form: {},
+        player: null
     }
   },
-  computed: {},
-  watch: {},
+  // 生命周期函数
   created() {
-    this.getDetail()
-    this.getList()
-    this.getTop5Fn()
+      if(this.$route.query.id) {
+          this.initData();
+      }
   },
-  mounted() {},
+  // 方法函数
   methods: {
-    getDetail() {
-      api.getDetail(this.$route.query.id).then((res) => {
-        this.form = res.data
-        this.form.attachments = this.form.attachments.split(',')
-      })
-    },
-    getTop5Fn() {
-      this.loading = true
-      api.getDetailTable(this.$route.query.id).then((res) => {
-        if (res.code === 200) {
-          this.list = res.data
-        }
-        this.loading = false
-      })
-    },
-    getList() {
-      this.loading = true
-      api
-        .getDetailTotal(this.$route.query.id)
-        .then(({ data }) => {
-          this.cardData = [
-            {
-              title: '订单总数',
-              tips: '所有商品全部的订单总数',
-              value: data.orderNum,
-            },
-            {
-              title: '订单总额(元)',
-              tips: '所有商品全部的订单总额,精确到两位小数点',
-              value: data.orderFee,
-            },
-            {
-              title: '退款总额(元)',
-              tips: '所有商品全部的退款总额,精确到两位小数点',
-              value: data.refundFee,
-            },
-            {
-              title: '净收入(元)',
-              tips: '订单总额-退款总额,精确到两位小数点',
-              value: data.netIncome,
-            },
-          ]
-        })
-        .catch((e) => {})
-        .finally(() => {})
-    },
-    getLineData(data) {
-      let val = {
-        type: 'customization',
-        startDate: data.beginTime,
-        endDate: data.endTime,
-        productId: this.$route.query.id,
+      playerMedia() {
+          this.player = videojs(this.$refs.videoPlayer, function onPlayerReady() {
+              console.log('Your player is ready!');
+          });
+          this.player.src({
+              src: this.form.video, // 替换为你的MP4视频URL
+              type: 'video/mp4'
+          });
+      },
+      async initData() {
+          try {
+              const res = await axios.get(`https://test.baoxianzhanggui.com/locallive-java/customer/product/getProductDetail?productId=${this.$route.query.id}` );
+              this.form = res.data.result
+              if(this.form.video) {
+                  this.playerMedia()
+              }
+          } catch (error) {
+              console.error('获取产品详情失败:', error);
+          }
       }
-      api.getDetailChart(val).then((res) => {
-        this.xData = res.data.xAxis.data
-        this.legend = res.data.legend.data
-        let arr1 = []
-        let arr2 = []
-        let arr3 = []
-        if (res.data.series && res.data.series.length) {
-          arr1 = res.data.series[0].data
-          arr2 = res.data.series[1].data
-          arr3 = res.data.series[2].data
-        }
-        this.series = [arr1, arr2, arr3]
-      })
-    },
   },
+  // 计算属性
+  computed: {
+  }
 }
 </script>
-
-<template>
-  <div>
-    <el-row :gutter="10" type="flex">
-      <el-col :span="18">
-        <CardGroupIndex :data="cardData"></CardGroupIndex>
-        <div class="g-card">
-          <div class="g-card-title">数据趋势</div>
-          <time-search-title @search="getLineData"></time-search-title>
-          <chart-line style="height: 300px" :legend="legend" :xData="xData" :series="series"></chart-line>
-        </div>
-        <div class="g-card">
-          <div class="g-card-title">员工订单Top5</div>
-          <el-table v-loading="loading" :data="list" style="width: 100%">
-            <el-table-column label="员工" align="center" min-width="100" prop="weUserName" />
-            <el-table-column label="订单总数" align="center" prop="orderNum" min-width="100"></el-table-column>
-            <el-table-column label="订单总额(元)" align="center" prop="totalFee" min-width="100"></el-table-column>
-          </el-table>
-        </div>
-      </el-col>
-      <el-col :span="6" style="min-width: 320px; display: flex; justify-content: space-around">
-        <PhoneTemplate>
-          <div class="phone-content">
-            <el-image
-              class="commodity-img commodity-thumb"
-              style="width: 100%; height: 100px"
-              :src="form.picture"></el-image>
-            <div class="price">¥{{ form.price }}</div>
-            <div class="content">{{ form.describe }}</div>
-            <el-image
-              v-for="(item, index) in form.attachments"
-              class="commodity-img"
-              :src="item"
-              :key="index"></el-image>
-          </div>
-        </PhoneTemplate>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.phone-content {
-  padding: 10px;
+<!-- 样式区域 -->
+<style lang='scss' scoped>
+.formImage{
+  display: block;
+  width: 320px;
+  height: 180px;
+  border-radius: 5px;
 }
-.price {
-  font-weight: 500;
-  font-size: 20px;
-  margin: 10px 0;
+#video{
+  width: 320px;
+  height: 180px;
 }
-.content {
-  margin: 10px 0;
+.topName{
+  font-size: 16px;
 }
-.commodity-img {
-  width: 100%;
+.listItem{
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+  span{
+    margin-right: 10px;
+  }
 }
 </style>

+ 140 - 276
src/views/commodityCenter/commodityManage/list.vue

@@ -1,296 +1,160 @@
-<script>
-import * as api from '@/api/commodityCenter/commodityManage'
-
-const defaultForm = {
-  picture: '',
-  price: 1,
-  describe: '',
-  attachments: [],
-}
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="queryform" label-width="100px" class="top-search">
+      <el-form-item label="商品名称">
+        <el-input v-model="queryform.productName" placeholder="请输入" clearable></el-input>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select v-model="queryform.productStatus" placeholder="请选择状态" clearable filterable>
+          <el-option label="全部" value=" "></el-option>
+          <el-option label="上架" value="1"></el-option>
+          <el-option label="下架" value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage()">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+      <templateTable ref="commonTable" :operationWidth="200" :SerialShow="true" :showOperation="true"
+        :showBatchDelete="false" :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="viewDetails(row)">查看</el-button>
+          <el-button v-if="row.productStatus == 1" type="text" @click="linkShare(row)">一键分享</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog title="生成推广链接" :visible.sync="linkShareShow" width="40%">
+      <div class="flex a-c">
+        <span>推广链接</span>
+        <el-input v-model="productLink" placeholder="请输入推广链接" clearable style="width: 70%;margin: 0 20px;"></el-input>
+        <el-button @click="linkCopy()">复制</el-button>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="linkShareShow = false">取 消</el-button>
+        <el-button type="primary" @click="linkShareShow = false">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
 
+<!-- 行为区域 -->
+<script>
+import axios from 'axios';
+import templateTable from "@/components/templateTable.vue";
 export default {
-  components: {},
-  props: {},
+  components: {
+    templateTable
+  },
+  // 数据存放区域
   data() {
     return {
-      query: {
-        pageNum: 1,
-        pageSize: 10,
-        name: '',
+      linkShareShow: false,//链接分享弹窗
+      queryform: {
+        productName: "",//商品名称
+        productStatus: "",//上架状态
+      },//页面检索对象
+      form: {},//提交表单
+      rules: {
+        labelName: [
+          {
+            required: true,
+            message: '请选择员工',
+            trigger: 'chnage',
+          },
+        ],
+
       },
-      loading: false,
-      submitLoading: false,
-      dialogVisible: false,
-      form: JSON.parse(JSON.stringify(defaultForm)),
-      newInput: '',
-      newInputVisible: false,
-      rules: Object.freeze({
-        picture: [{ required: true, message: '必填项', trigger: 'change' }],
-        price: [{ required: true, message: '必填项', trigger: 'change' }],
-        describe: [{ required: true, message: '必填项', trigger: 'blur' }],
-      }),
-      // 选中数组
-      ids: [],
-      multiple: true,
-      total: 0,
-      list: [],
-      lastSyncTime: 0,
-      fileList: [],
+
+      Result: {
+          rows: [],
+          total: 100,
+          pageNum: 1,
+          pageSize: 10,
+      },
+      Columns: [
+        { prop: "productName", label: "商品名称", minWidth: 180, },
+        { prop: "categoryName", label: "商品类目", minWidth: 180, },
+        { prop: "soldPrice", label: "价格", minWidth: 180, formatter: this.soldPriceFormatter },
+        { prop: "merchantName", label: "商户名称", minWidth: 180 },
+        { prop: "soldQuantity", label: "已售", minWidth: 180 },
+        { prop: "productStatus", label: "状态", minWidth: 180, formatter: this.productStatusFormatter },
+      ],
+      productLink: '',
     }
   },
-  computed: {},
+  // 生命周期函数
   created() {
-    this.$store.dispatch(
-      'app/setBusininessDesc',
-      `
-			     <div>快捷创建商品图册,员工一键发送给客户,客户直接购买。</div>
-			   `,
-    )
-    this.getList()
+
   },
+  // 方法函数
   methods: {
-    resetForm() {
-      this.query.name = ''
-      this.getList(1)
+    soldPriceFormatter(row) {
+      return row.soldPrice + '元';
     },
-    getList(page) {
-      page && (this.query.pageNum = page)
-      this.loading = true
-      api
-        .getList(this.query)
-        .then(({ rows, total, lastSyncTime }) => {
-          this.list = rows
-          this.total = +total
-          this.lastSyncTime = lastSyncTime
-          this.loading = false
-        })
-        .catch(() => {
-          this.loading = false
-        })
+    productStatusFormatter(row) {
+      return row.productStatus == 0 ? "下架" : "上架"
     },
-    edit(data) {
-      this.fileList = []
-      if (data) {
-        api.getDetail(data.id).then((res) => {
-          this.form = res.data
-          if (this.form.attachments) {
-            let arr = this.form.attachments.split(',')
-            arr.forEach((dd) => {
-              this.fileList.push({ url: dd })
-            })
-          }
-        })
-      } else {
-        this.form = JSON.parse(JSON.stringify(defaultForm))
-      }
-      this.dialogVisible = true
-    },
-    sync() {
-      const loading = this.$loading({
-        lock: true,
-        text: 'Loading',
-        spinner: 'el-icon-loading',
-        background: 'rgba(0, 0, 0, 0.7)',
-      })
-      api
-        .sync()
-        .then(() => {
-          loading.close()
-          this.msgSuccess('后台开始同步数据,请稍后关注进度')
-          this.getList()
-        })
-        .catch(() => {
-          loading.close()
-        })
-    },
-    submit() {
-      this.$refs['form'].validate((valid) => {
-        let form = JSON.parse(JSON.stringify(this.form))
-        form.price = form.price.toFixed(2)
-        form.attachments = this.fileList.map((dd) => dd.url).join(',')
-        this.submitLoading = true
-        api[form.id ? 'update' : 'add'](form, form.id)
-          .then(() => {
-            this.msgSuccess('操作成功')
-            this.dialogVisible = false
-            this.getList()
-          })
-          .finally(() => {
-            this.submitLoading = false
-          })
+    // 查看详情
+    viewDetails(row) {
+      this.$router.push({
+        path: 'commodityManageDetail',
+        query: { id: row.productId },
       })
     },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map((item) => item.id)
-      this.multiple = !selection.length
+    /**
+     * 停用
+     * @param row status 状态 true 已绑定 false 未绑定
+     */
+    linkShare(row) {
+      this.linkShareShow = true;
+      if (row.type == 1) {
+        this.productLink = `https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=pages/mall/detail/details-food.html?productId=${row.productId}&merchantId=${row.merchantId}&categoryId=${row.categoryId}&env_version=develop#wechat-redirect`
+      } else if (row.type == 2) {
+        this.productLink = `https://open.weixin.qq.com/sns/getexpappinfo?appid=wxab9634bf98628a03&path=pages/mall/detail/details-service.html?productId=${row.productId}&merchantId=${row.merchantId}&categoryId=${row.categoryId}&env_version=develop#wechat-redirect`
+      }
     },
-    /** 删除按钮操作 */
-    remove(id) {
-      const operIds = id || this.ids + ''
-      this.$confirm('是否确认删除吗?', '警告', {
-        type: 'warning',
-      })
-        .then(function () {
-          return api.remove(operIds)
-        })
-        .then(() => {
-          this.getList()
-          this.msgSuccess('删除成功')
-        })
+    linkCopy() {
+      let inputs = document.createElement("input")     //创建节点
+      inputs.value = this.productLink //给节点赋值
+      document.body.appendChild(inputs) //渲染节点(要不然不起作用,可以添加隐藏属性)
+      inputs.select() //选中节点
+      let actions = document.execCommand("Copy") //指定复制命令(返回的是一个boolean类型)
+      if (this.productLink && actions) {
+        this.$message.success('复制成功!')
+      }
     },
-    goRoute(row) {
-      this.$router.push({
-        path: './detail',
-        query: {
-          id: row.id,
-        },
-      })
+    async findPage() {
+      // if (data && data.pageRequest) {
+      //   this.queryform.pageNum = data.pageRequest.pageNum;
+      //   this.queryform.pageSize = data.pageRequest.pageSize;
+      // }
+      try {
+        const res = await axios.get('https://test.baoxianzhanggui.com/locallive-java/customer/product/getPageProductList', {
+          params: {
+              ...this.queryform,
+              pageNum: this.Result.pageNum,
+              pageSize: this.Result.pageSize
+          }
+        });
+        this.Result = {
+          rows: res.data.rows,
+          pageNum: res.data.pageNum,
+          pageSize: res.data.pageSize,
+          total: res.data.total,
+        };
+      } catch (error) {
+        console.error('获取产品列表失败:', error);
+      }
     },
   },
+  // 计算属性
+  computed: {
+  }
 }
 </script>
-<template>
-  <div>
-    <el-form ref="queryForm" :inline="true" :model="query" label-width="110px" class="top-search">
-      <el-form-item label="商品名称或描述" prop="name">
-        <el-input clearable v-model="query.name" placeholder="请输入"></el-input>
-      </el-form-item>
-      <el-form-item label="">
-        <el-button type="primary" @click="getList(1)">查询</el-button>
-        <el-button @click="resetForm()">重置</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="g-card">
-      <div class="mid-action">
-        <el-button type="primary" class="mr10" @click="edit()">新建商品</el-button>
-        <el-button :disabled="!ids.length" type="danger" @click="remove()">批量删除</el-button>
-      </div>
-
-      <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="商品" align="center" prop="" width="200">
-          <div slot-scope="{ row }">
-            <div style="display: flex">
-              <el-image
-                style="width: 50px; height: 50px; margin-right: 5px; flex-shrink: 0"
-                :src="row.picture"></el-image>
-              <span class="limit_span">{{ row.describe }}</span>
-            </div>
-          </div>
-        </el-table-column>
-        <el-table-column label="单价(元)" align="center" prop="price" />
-        <el-table-column label="订单总数" align="center" prop="orderNum" />
-        <el-table-column label="订单总额(元)" align="center" prop="orderTotalAmount" />
-        <el-table-column label="创建人" align="center" prop="createBy" />
-        <el-table-column label="最近操作时间" align="center" prop="updateTime" width="180"></el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-          <template slot-scope="{ row, index }">
-            <el-button type="text" @click="goRoute(row)">详情</el-button>
-            <el-button type="text" @click="edit(row, index)">编辑</el-button>
-            <el-button type="text" @click="remove(row.id)">删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        :page.sync="query.pageNum"
-        :limit.sync="query.pageSize"
-        @pagination="getList()" />
-    </div>
-
-    <!-- 弹窗 -->
-    <el-dialog :title="form.id ? '修改' : '新建'" :visible.sync="dialogVisible" :close-on-click-modal="false">
-      <el-row>
-        <el-col :span="12">
-          <el-form ref="form" :model="form" :rules="rules" label-width="130px">
-            <el-form-item label="商品封面" prop="picture">
-              <upload :fileUrl.sync="form.picture" type="0" :maxSize="10" :format="['jpg', 'png']">
-                <div slot="tip" class="tip">支持jpg/png格式,图片大小不超过10M</div>
-              </upload>
-            </el-form-item>
-            <el-form-item label="商品单价(元)" prop="price">
-              <el-input-number v-model="form.price" :precision="2" :step="0.1" :min="0" :max="50000"></el-input-number>
-              <div class="tip">精确到小数点后两位,不超过5万元</div>
-            </el-form-item>
-            <el-form-item label="商品标题或描述" prop="describe">
-              <el-input
-                v-model="form.describe"
-                type="textarea"
-                :maxlength="270"
-                show-word-limit
-                :autosize="{ minRows: 4, maxRows: 50 }"
-                placeholder="请输入"></el-input>
-            </el-form-item>
-            <el-form-item label="商品详情">
-              <upload
-                :fileList.sync="fileList"
-                :multiple="true"
-                :limit="8"
-                type="0"
-                :maxSize="10"
-                :format="['jpg', 'png']">
-                <div slot="tip" class="tip">最多添加八张详情</div>
-              </upload>
-            </el-form-item>
-          </el-form>
-        </el-col>
-        <el-col :span="12">
-          <PhoneTemplate>
-            <div class="phone-content">
-              <el-image
-                v-if="form.picture"
-                class="commodity-img commodity-thumb"
-                style="width: 100%"
-                :src="form.picture"></el-image>
-              <div v-else class="commodity-img commodity-thumb"></div>
-              <div class="price">¥{{ form.price }}</div>
-              <div class="content">{{ form.describe }}</div>
-              <el-image v-for="(item, index) in fileList" class="commodity-img" :src="item.url" :key="index"></el-image>
-            </div>
-          </PhoneTemplate>
-        </el-col>
-      </el-row>
-      <div slot="footer" class="dialog-footer ar">
-        <el-button type="primary" v-loading="submitLoading" @click="submit">确 定</el-button>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-<style lang="scss" scoped>
-.tip {
-  color: #aaa;
-  font-size: 12px;
-  line-height: 20px;
-}
-.phone-content {
-  padding: 10px;
-}
-.price {
-  font-weight: 500;
-  font-size: 20px;
-  margin: 10px 0;
-}
-.content {
-  margin: 10px 0;
-}
-.commodity-img {
-  width: 100%;
-}
-.limit_span {
-  // width: 250px;
-  // overflow: hidden;
-  // text-overflow: ellipsis;
-  // // white-space: nowrap;
-  // display: inline-block;
-
-  white-space: pre-wrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  display: -webkit-box;
-  -webkit-box-orient: vertical;
-  -webkit-line-clamp: 2;
-}
-</style>
+<!-- 样式区域 -->
+<style lang='scss' scoped></style>

+ 1 - 1
src/views/communityOperating/keywords/list.vue

@@ -5,7 +5,7 @@
     props: {},
     data() {
       return {
-        h5Link: 'https://platform.wshoto.com/H5/?corpId=ww8e09372aff8d9190',
+        h5Link: 'https://platform.wshoto.com/H5/?corpId=wwfe67d19509d43ec5',
         query: {
           pageNum: 1,
           pageSize: 10,

+ 10 - 2
src/views/customerManage/customer.vue

@@ -41,7 +41,8 @@ export default {
         gourpName: '',
         weTags: [],
       },
-      list: [], // 客户列表
+      list: [
+      ], // 客户列表
       staffList: [], // 所有员工列表
       dialogVisible: false, // 选择标签弹窗显隐
       dialogVisibleSelectUser: false, // 选择添加人弹窗显隐
@@ -328,6 +329,8 @@ export default {
       this.queryUser = list
     },
     submitSelectTag(selected) {
+      console.log(this.currentEidt)
+      return
       if (this.tagDialogType.type === 'query') {
         this.queryTag = selected
         this.dialogVisible = false
@@ -537,7 +540,7 @@ export default {
           <el-button type="info" @click="exportCustomerFn">
             导出列表
           </el-button>
-          
+
         </div>
       </div>
 
@@ -575,6 +578,11 @@ export default {
           row.weFlowerCustomerRels[0] ? row.weFlowerCustomerRels[0].userName : ''
         }}</template> -->
         </el-table-column>
+        <el-table-column prop="source" label="客户来源" align="center">
+            <template slot-scope="scope">
+                {{ scope.row.source == '0'?'客群活码':scope.row.source == '1'?'门店活码':scope.row.source == '2'?'识客活码':scope.row.source == '3'?'拉新活码':'' }}
+            </template>
+        </el-table-column>
         <el-table-column prop="trackState" label="商机阶段" align="center">
           <template slot-scope="{ row }">
             <!-- <el-tag v-if="row.trackState" :type="dictTrackState[~~row.trackState + ''].color">

+ 85 - 0
src/views/customerManage/userSync/detail.vue

@@ -0,0 +1,85 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <div class="g-card  ">
+      <span class="g-card-title">用户详情</span>
+      <!-- 表单 -->
+      <!-- 模板内容 -->
+      <el-form ref="queryForm"  :model="queryForm" label-width="100px" :disabled="true">
+        <el-form-item label="用户ID" prop="userCode">
+          <el-input v-model="queryForm.userCode" placeholder="用户ID"></el-input>
+        </el-form-item>
+        <el-form-item label="用户姓名" prop="name">
+          <el-input v-model="queryForm.name" placeholder="请输入用户姓名"></el-input>
+        </el-form-item>
+        <el-form-item label="性别" prop="sex">
+          <el-input v-model="queryForm.sex" placeholder="请输入性别"></el-input>
+        </el-form-item>
+        <el-form-item label="生日" prop="birthday">
+          <el-input v-model="queryForm.birthday" placeholder="请输入生日"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号" prop="phone">
+          <el-input v-model="queryForm.phone" placeholder="请输入手机号"></el-input>
+        </el-form-item>
+        <el-form-item label="用户状态" prop="status">
+          <el-input v-model="queryForm.status" placeholder="用户状态"></el-input>
+        </el-form-item>
+        <el-form-item label="用户类型" prop="type">
+          <el-input v-model="queryForm.type" placeholder="用户类型"></el-input>
+        </el-form-item>
+        <el-form-item label="注册时间" prop="registerTime">
+          <el-input v-model="queryForm.registerTime" placeholder="注册时间"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import * as api from '@/api/customerManage/userSync'
+import {findWeUserBaseInfo} from "@/api/customerManage/userSync";
+export default {
+  // 数据存放区域
+  data() {
+    return {
+      queryForm:{},
+
+    }
+  },
+  // 生命周期函数
+  created() {
+    this.initData();
+  },
+  // 方法函数
+  methods: {
+    initData() {
+      api.findWeUserBaseInfo({
+          id: this.$route.query.id
+      }).then(res => {
+          if(res.code == 200) {
+            this.queryForm = {
+                userCode: res.data.userCode,
+                name: res.data.name,
+                sex: res.data.sex?'男':'女',
+                birthday: res.data.birthday,
+                phone: res.data.phone,
+                status: res.data.status?'临时用户':'正式用户',
+                type: res.data.type == 0?'普通用户':'',
+                registerTime: res.data.registerTime,
+            }
+          }
+      })
+    }
+  },
+  // 计算属性
+  computed: {
+
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped>
+
+</style>

+ 227 - 0
src/views/customerManage/userSync/list.vue

@@ -0,0 +1,227 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="query" label-width="100px" class="top-search">
+      <el-form-item label="用户ID">
+        <el-input v-model="query.userCode" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="用户姓名">
+        <el-input v-model="query.name" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="手机号">
+        <el-input v-model="query.phone" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="用户来源">
+        <el-select v-model="query.source" placeholder="请选择">
+          <el-option value="0" label="晋掌柜"></el-option>
+          <el-option value="1" label="本地生活"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="用户状态">
+        <el-select v-model="query.status" placeholder="请选择">
+          <el-option value="0" label="正式用户"></el-option>
+          <el-option value="1" label="临时用户"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="企微触达状态">
+        <el-select v-model="query.deliveredStatus" placeholder="请选择">
+          <el-option value="0" label="未触达"></el-option>
+          <el-option value="1" label="已触达"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage()">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+        <!-- <el-button
+          v-hasPermi="['customerManage:customer:export']"
+          type="info"
+          @click="exportCustomer"
+          >导出列表</el-button
+        > -->
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+
+      <templateTable ref="commonTable" :operationWidth="200" :showOperation="true" :showBatchDelete="false"
+        :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="viewDetails(row)">查看</el-button>
+          <el-button type="text" v-if="row.ownerUserId" @click="transferUser(row)">转出</el-button>
+          <el-button type="text" v-else @click="transferUser(row)">分配</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog title="选择员工" :visible.sync="transferUserShow" width="40%">
+      <div>
+        <el-form ref="form" :rules="rules" :model="form" label-position="left" label-width="120px">
+          <el-form-item label="选择员工" prop="labelName">
+            <el-select v-model="form.labelName" placeholder="请选择,支持关键词搜索" clearable filterable>
+              <el-option v-for="(item, index) in userList" :label="item.userName" :value="item.userId"></el-option>
+            </el-select>
+          </el-form-item>
+
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="transferUserShow = false">取 消</el-button>
+        <el-button type="primary" @click="userOperation">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import templateTable from "@/components/templateTable.vue";
+import * as api from '@/api/customerManage/userSync'
+import { transferOwner, userTransferOwner } from "@/api/customerManage/userSync";
+export default {
+  components: {
+    templateTable
+  },
+  // 数据存放区域
+  data() {
+    return {
+      transferUserShow: false,//转出弹窗
+      //页面检索对象
+      query: {
+        name: "",//姓名
+        phone: "",//手机号
+        source: "",//来源
+        status: "",//状态
+        userCode: "",//用户id
+        deliveredStatus: "",
+
+      },
+      form: {},//提交表单
+      rules: {
+        labelName: [
+          {
+            required: true,
+            message: '请选择员工',
+            trigger: 'chnage',
+          },
+        ],
+
+      },
+      Result: {
+        rows: [],
+        total: 100,
+        pageNum: 1,
+        pageSize: 10,
+      },
+      Columns: [
+        { prop: "userCode", label: "用户ID", minWidth: 180, },
+        { prop: "name", label: "用户姓名", minWidth: 160 },
+        { prop: "sex", label: "性别", minWidth: 120, formatter: this.sexFormatter },
+        { prop: "birthday", label: "生日", minWidth: 160 },
+        { prop: "phone", label: "手机号", minWidth: 160, },
+        { prop: "source", label: "用户来源", minWidth: 160, formatter: this.sourceFormatter },
+        { prop: "status", label: "用户状态", minWidth: 160, formatter: this.statusFormatter },
+        { prop: "type", label: "用户类型", minWidth: 160, formatter: this.typeFormatter },
+        { prop: "registerTime", label: "注册时间", minWidth: 160, },
+        { prop: "deliveredStatus", label: "企微触达状态", minWidth: 160, formatter: this.deliveredStatusFormatter },
+        // { prop: "registerTime", label: "添加时间", minWidth: 160, },
+        { prop: "updateTime", label: "最近互动时间", minWidth: 160, },
+        { prop: 'ownerUserName', label: '归属员工', minWidth: 160 }
+      ],
+      userList: [],
+      userId: ''
+    }
+  },
+  // 生命周期函数
+  created() {
+  },
+  // 方法函数
+  methods: {
+    resetForm(){
+      this.query= {
+        name: "",//姓名
+        phone: "",//手机号
+        source: "",//来源
+        status: "",//状态
+        userCode: "",//用户id
+        deliveredStatus: "",
+      }
+      this.findPage();
+    },
+    sexFormatter(row, column) {
+      return row.sex == 0 ? '女' : '男'
+    },
+    sourceFormatter(row, column) {
+      return row.source == 0 ? '晋掌柜' : '掌柜生活'
+    },
+    statusFormatter(row, column) {
+      return row.status == 0 ? '正式用户' : '临时用户'
+    },
+    typeFormatter(row, column) {
+      return row.type == 0 ? '普通用户' : ''
+    },
+    deliveredStatusFormatter(row, column) {
+      return row.deliveredStatus == 0 ? '未触达' : '已触达'
+    },
+    // 查看详情
+    viewDetails(row) {
+      this.$router.push({
+        path: 'userSyncDetail',
+        query: { id: row.id },
+      })
+    },
+    // 操作用户
+    userOperation() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          api.userTransferOwner(this.userId, this.form.labelName).then(res => {
+            if (res.code == 200) {
+              this.$message.success(res.msg)
+              this.findPage()
+            }
+            this.transferUserShow = false;
+          })
+        }
+      })
+    },
+    // 用户转出弹窗
+    transferUser(row) {
+      this.transferUserShow = true;
+      this.userId = row.id
+      this.initUserList()
+    },
+    initUserList() {
+      api.userList().then(res => {
+        if (res.code == 200) {
+          this.userList = res.data
+        }
+      })
+    },
+    //列表查询
+    findPage() {
+      let that = this
+      api.userFindWeUserList({
+          ...this.query,
+          pageNum: this.Result.pageNum,
+          pageSize: this.Result.pageSize
+      }).then((res) => {
+        if (res.code == 200) {
+          that.Result = {
+            rows: res.rows,
+            total: res.total,
+              pageSize: res.pageSize,
+              pageNum: res.pageNum
+          }
+        }
+      })
+    },
+    // 同步用户
+    syncUser() {
+
+    },
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped></style>

+ 81 - 0
src/views/customerManage/wechatCustomer/detail.vue

@@ -0,0 +1,81 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <div class="g-card  ">
+      <span class="g-card-title">用户详情</span>
+      <!-- 表单 -->
+      <!-- 模板内容 -->
+      <el-form ref="detailForm"  :model="detailForm" label-position="left" label-width="80px" disabled>
+        <el-form-item label="openid" prop="wxOpenid">
+          <el-input v-model="detailForm.wxOpenid" placeholder="用户openid"></el-input>
+        </el-form-item>
+        <el-form-item label="用户ID" prop="userCode">
+          <el-input v-model="detailForm.userCode" placeholder="请输入用户ID"></el-input>
+        </el-form-item>
+        <el-form-item label="微信昵称" prop="wxNickname">
+          <el-input v-model="detailForm.wxNickname" placeholder="请输入微信昵称"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号" prop="wxPhone">
+          <el-input v-model="detailForm.wxPhone" placeholder="请输入手机号"></el-input>
+        </el-form-item>
+        <el-form-item label="头像" prop="wxAvatar">
+            <div class="avatar">
+                <img :src="detailForm.wxAvatar">
+            </div>
+        </el-form-item>
+        <el-form-item label="绑定时间" prop="bindTime">
+          <el-input v-model="detailForm.bindTime" placeholder="绑定时间"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import * as api from '@/api/customerManage/wechatCustomer'
+export default {
+  // 数据存放区域
+  data() {
+    return {
+      detailForm:{},
+      id:"",
+    }
+  },
+  // 生命周期函数
+  created() {
+    this.id = this.$route.query.id;
+    this.detailquery();
+  },
+  // 方法函数
+  methods: {
+    detailquery(){
+      api.findWeCustomerUserBaseInfo({id: this.id}).then((res)=>{
+          if(res.code == 200) {
+              this.detailForm = res.data
+          }
+      })
+    }
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped>
+.avatar{
+  width: 100px;
+  height: 100px;
+  border-radius: 50%;
+  border: 1px solid #DCDFE6;
+  margin-left: 10px;
+  img{
+    display: block;
+    width: 100%;
+    height: 100%;
+    border-radius: 50%;
+  }
+}
+</style>

+ 210 - 0
src/views/customerManage/wechatCustomer/list.vue

@@ -0,0 +1,210 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="queryform" label-width="80px" class="top-search">
+      <el-form-item label="openid" >
+        <el-input v-model="queryform.wxOpenid" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="用户ID" >
+        <el-input v-model="queryform.userCode" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="微信昵称" >
+        <el-input v-model="queryform.wxNickname" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="状态" >
+        <el-select v-model="queryform.status" placeholder="请选择,支持关键词搜索" clearable filterable>
+          <el-option label="全部" value="1"></el-option>
+          <el-option label="已绑定" value="2"></el-option>
+          <el-option label="未绑定" value="3"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+        <!-- <el-button
+          v-hasPermi="['customerManage:customer:export']"
+          type="info"
+          @click="exportCustomer"
+          >导出列表</el-button
+        > -->
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+      <templateTable ref="commonTable" :operationWidth="200" :showOperation="true" :showBatchDelete="false"
+        :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="viewDetails(row)">查看</el-button>
+          <el-button type="text" @click="userBinding(row)">{{ row.status ? "解绑" : "绑定" }}</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog title="选择用户" :visible.sync="userBindingShow" width="40%">
+      <div>
+        <el-form ref="form" :rules="rules" :model="form" label-position="left" label-width="120px">
+          <el-form-item label="选择用户" prop="labelName">
+            <el-select v-model="form.labelName" placeholder="请选择,支持关键词搜索" clearable filterable>
+                <el-option v-for="(item, index) in userList" :label="item.name" :value="item.id" :key="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="userBindingShow = false">取 消</el-button>
+        <el-button type="primary" @click="userOperation">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import templateTable from "@/components/templateTable.vue";
+import * as api from '@/api/customerManage/wechatCustomer'
+import {customerUnbindUser} from "@/api/customerManage/wechatCustomer";
+
+export default {
+  components: {
+    templateTable
+  },
+  // 数据存放区域
+  data() {
+    return {
+      userBindingShow: false,//转出弹窗
+      queryform: {
+        userCode:"",//用户id
+        status:"",//状态
+        wxOpenid:"",//用户id
+        wxNickname:"",//微信昵称
+      },//页面检索对象
+      form: {
+          labelName: ''
+      },//提交表单
+      rules: {
+        labelName: [
+          {
+            required: true,
+            message: '请选择员工',
+            trigger: 'chnage',
+          },
+        ],
+
+      },
+      Result: {
+          rows: [],
+          total: 100,
+          pageNum: 1,
+          pageSize: 10
+      },
+      Columns: [
+        { prop: "wxOpenid", label: "openid", minWidth: 180, },
+        { prop: "userCode", label: "用户ID", minWidth: 180, },
+        { prop: "wxNickname", label: "微信昵称", minWidth: 160 },
+        { prop: "wxPhone", label: "手机号码", minWidth: 120 },
+        { prop: "wxAvatar", label: "头像URL", minWidth: 160 },
+        { prop: "bindTime", label: "绑定时间", minWidth: 160, formatter: this.typeFormatter },
+        { prop: "status", label: "状态", minWidth: 160, formatter: this.originalLevelFormatter },
+        { prop: "createTime", label: "最后同步时间", minWidth: 160, },
+
+      ],
+      userList: [],
+      userId: ''
+    }
+  },
+  // 生命周期函数
+  created() {
+      this.initUserList()
+  },
+  // 方法函数
+  methods: {
+    // 查看详情
+    viewDetails(row) {
+      this.$router.push({
+        path: 'wechatCustomerDetail',
+        query: { id: row.id },
+      })
+    },
+    // 操作用户
+    userOperation() {
+        let that = this
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+            api.customerBindUser(that.userId, that.form.labelName).then(res => {
+                if(res.code == 200) {
+                    this.$message.success(res.msg)
+                    this.findPage()
+                }
+                this.userBindingShow = false
+            })
+        }
+      })
+    },
+    /**
+     * 绑定方法
+     * @param row status 状态 true 已绑定 false 未绑定
+     */
+    userBinding(row) {
+      if (row.status) {
+        this.$confirm('您正在执行解绑操作。解绑后,该 openid 与客户 ID的关联关系将被清除,若需重新绑定需手动操作。</br>请再次确认是否解绑?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          dangerouslyUseHTMLString: true,
+        }).then(() => {
+          api.customerUnbindUser(row.id).then(res => {
+              if(res.code == 200) {
+                  this.$message.success(res.msg)
+                  this.findPage()
+              }
+          })
+          // this.$message({
+          //   type: 'success',
+          //   message: '删除成功!'
+          // });
+        }).catch(() => {
+
+        });
+      } else {
+        this.userBindingShow = true;
+        this.userId = row.id
+      }
+    },
+    initUserList() {
+        api.userList(localStorage.getItem('username')).then(res => {
+            if(res.code == 200) {
+                this.userList = res.data
+            }
+        })
+    },
+    //列表查询
+    findPage() {
+      api.findWeCustomerUserList({
+          ...this.queryform,
+          pageNum: this.Result.pageNum,
+          pageSize: this.Result.pageSize
+      }).then((res)=>{
+          if(res.code == 200) {
+              this.Result = {
+                  rows: res.rows,
+                  total: res.total,
+                  pageSize: res.pageSize,
+                  pageNum: res.pageNum
+              }
+          }
+      })
+    },
+      originalLevelFormatter(row,column){
+          return row.status==0?'未绑定':'已绑定'
+      },
+    // 同步用户
+    syncUser() {
+
+    },
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped></style>

+ 331 - 0
src/views/customerOperation/smartTagging.vue

@@ -0,0 +1,331 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="queryform" label-width="100px" class="top-search">
+      <el-form-item label="行为类型名称">
+        <el-input v-model="queryform.actionName" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="标签组">
+        <el-select v-model="queryform.tagGroupId" placeholder="请选择" clearable filterable @change="tagsArrayChange1">
+          <el-option v-for="(item, index) in tagsArray1" :key="index" :label="item.groupName"
+            :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联标签"  >
+        <el-select v-model="queryform.tagId" placeholder="请选择"  >
+          <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in tagsSubSet1"
+            :key="index"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage()">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+      <div class="mid-action">
+        <el-button class="ml10" type="primary" @click="createBehavior">
+          新建
+        </el-button>
+      </div>
+      <templateTable ref="commonTable" :operationWidth="200" :SerialShow="false" :showOperation="true"
+        :showBatchDelete="false" :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="viewDetails(row)">查看</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog title="添加智能打标规则" :visible.sync="createBehaviorShow" width="900px">
+      <div>
+        <el-form ref="form" :rules="rules" :model="form" label-position="left" label-width="120px" :disabled="disabled">
+          <el-form-item label="行为类型名称" prop="actionId">
+            <el-select v-model="form.actionId" placeholder="请选择,支持关键词搜索" clearable filterable @change="actionChange">
+              <el-option :label="item.name" :value="item.code" v-for="(item, index) in behaviorTypeList"
+                :key="index.id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="规则" prop="markRules1">
+            <div class="flex a-c   customRules " v-if="form.actionId == 'ACT003'">
+              <span>客户24小时内点击活动链接≥</span>
+              <el-input v-model="form.markRules1"></el-input>
+              <span>次</span>
+            </div>
+            <div class="flex a-c customRules " v-else-if="form.actionId == 'ACT010'">
+              <span>历史累计订单金额≥</span>
+              <el-input v-model="form.markRules1"></el-input>
+              <span>元</span>
+            </div>
+            <div class="flex a-c customRules " v-else-if="form.actionId == 'ACT005'">
+              <span>首次下单订单金额≥</span>
+              <el-input v-model="form.markRules1"></el-input>
+              <span>元</span>
+            </div>
+            <div class="flex a-c customRules " v-else-if="form.actionId == 'ACT006'">
+              <span>客户连续</span>
+              <el-input v-model="form.markRules1"></el-input>
+              <span>天未打开小程序且未回复消息</span>
+            </div>
+            <div class="flex a-c customRules " v-else-if="form.actionId == 'ACT008'">
+              <span>客户升级为</span>
+              <el-input v-model="form.markRules1"></el-input>
+            </div>
+            <div class="flex a-c customRules " v-else-if="form.actionId == 'ACT009'">
+              <span>客户在聊天中发送</span>
+              <el-input v-model="form.markRules1" type="textarea" style="margin: 0 10px;" maxlength="200"
+                show-word-limit></el-input>
+              <span>等关键词</span>
+            </div>
+            <el-input v-else v-model="form.markRules1"></el-input>
+          </el-form-item>
+          <el-form-item label="标签组">
+            <el-select v-model="form.tagGroupId" placeholder="请选择" clearable filterable @change="tagsArrayChange">
+              <el-option v-for="(item, index) in tagsArray" :key="index" :label="item.groupName"
+                :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="关联标签" v-if="form.tagGroupId" prop="tagIdList">
+            <el-select v-model="form.tagIdList" placeholder="请选择" clearable multiple>
+              <el-option :label="item.name" :value="item.tagId" v-for="(item, index) in tagsSubSet"
+                :key="index"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="createBehaviorShow = false">取 消</el-button>
+        <el-button type="primary" @click="userOperation">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import templateTable from "@/components/templateTable.vue";
+import * as api from '@/api/customerManage/smartTagging'//智能打标api
+import * as userActionTypeApi from '@/api/customerManage/userActionTypeConfig'//获取行为类型数据
+
+export default {
+  components: {
+    templateTable
+  },
+  // 数据存放区域
+  data() {
+    return {
+      disabled: false,
+      behaviorTypeList: [],//行为类型名称
+      createBehaviorShow: false,//转出弹窗
+      queryform: {
+        pageNum: 1,
+        pageSize: 10,
+        tagGroupId:"",
+        tagId:"",
+      },//页面检索对象
+      form: {
+        actionId: "",
+        actionName: "",
+        markRules1: "",//规则
+        tagGroupId: "",//标签组id
+        tagGroupName: "",//标签组name
+        tagIdList: [],//标签列表
+        tagId: "",
+      },//提交表单
+      rules: {
+        actionId: [
+          {
+            required: true,
+            message: '请选择行为类型',
+            trigger: 'chnage',
+          },
+        ],
+        markRules1: [
+          {
+            required: true,
+            message: '请选择补全规则',
+            trigger: 'blur',
+          },
+        ],
+        tagIdList: [
+          {
+            required: true,
+            message: '请选择标签',
+            trigger: 'change',
+          },
+        ]
+
+      },
+      Result: {},
+      Columns: [
+        { prop: "actionName", label: "行为类型名称", minWidth: 180, },
+        { prop: "markRules1", label: "规则名称", minWidth: 180, formatter: this.markRules1Formatter },
+        { prop: "tagList", label: "关联标签", minWidth: 360, formatter: this.tagListFormatter },
+      ],
+      tagsArray: [],//标签组
+      tagsArray1: [],//标签组
+      tagsSubSet: [],//标签列表
+      tagsSubSet1: [],//标签列表
+    }
+  },
+  // 生命周期函数
+  created() {
+    this.userActionType();//获取行为列表
+    this.fetchTags();//获取标签
+  },
+  // 方法函数
+  methods: {
+    resetForm(){
+      this.queryform= {
+        pageNum: 1,
+        pageSize: 10,
+        tagGroupId:"",
+        tagId:"",
+      }
+      this.findPage();
+    },
+    tagListFormatter(row) {
+      let result = '';
+      row.tagList.forEach((item, index) => {
+        result += item.name; // 直接拼接
+        if (index < row.tagList.length - 1) {
+          result += ' '; // 在元素之间添加空格
+        }
+      });
+      return result
+    },
+    //条将规则判断
+    markRules1Formatter(row) {
+      let type = row.actionId;
+      switch (type) {
+        case 'ACT003':
+          return `客户24小时内点击活动链接≥${row.markRules1}次`;
+        case 'ACT005':
+          return `首次下单订单金额≥${row.markRules1}元`;
+        case 'ACT006':
+          return `客户连续${row.markRules1}天未打开小程序且未回复消息`;
+        case 'ACT008':
+          return `客户升级为${row.markRules1}`;
+        case 'ACT009':
+          return `客户在聊天中发送${row.markRules1}等关键词`;
+        case 'ACT010':
+          return `历史累计订单金额≥${row.markRules1}元`;
+        default:
+          return row.markRules1; // 处理未匹配的情况
+      }
+    },
+    //获取对应标签组标签列表
+    tagsArrayChange(value) {
+      this.form.tagIdList = [];//清空历史
+      this.form.tagGroupName = this.tagsArray.find(val => val.id == value).groupName;
+      this.tagsSubSet = this.tagsArray.find(val => val.id == value).weTags;
+    },
+    tagsArrayChange1(value) {
+      this.queryform.tagId='';
+      console.log(value)
+      console.log(this.tagsArray1)
+      this.tagsSubSet1 = this.tagsArray1.find(val => val.id == value).weTags;
+    },
+    actionChange(value) {
+      this.form.actionName = this.behaviorTypeList.find(val => val.code == value).name;
+    },
+    //获取标签组
+    fetchTags() {
+      api.tagList({
+        pageNum: 1,
+        pageSize: 100,
+        groupName: '',
+        groupTagType: 1,
+      }).then((res) => {
+        if (res.code == 200) {
+          this.tagsArray = res.rows;
+          this.tagsArray1 = res.rows;
+        }
+      })
+    },
+    userActionType() {
+      userActionTypeApi.behaviorList({
+        name: "",
+        delFlag: 0,
+        pageNum: 1,
+        pageSize: 10,
+      }).then((res) => {
+        if (res.code == 200) {
+          this.behaviorTypeList = res.rows;
+        }
+      })
+    },
+    // 查看详情
+    viewDetails(row) {
+      this.disabled = true;
+      console.log(row)
+      this.createBehaviorShow = true;
+      this.form = row;
+      this.form.tagIdList = row.tagList.map(ele => {
+        return ele.name;
+      })
+    },
+    // 操作用户
+    userOperation() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.form.tagId = this.form.tagIdList.join(',');
+          api.markAdd(this.form).then((res) => {
+            if (res.code == 200) {
+              this.$message({
+                type: 'success',
+                message: '添加成功!'
+              });
+              this.createBehaviorShow = false;
+              this.findPage();
+            }
+          })
+        }
+      })
+    },
+    /**
+     * 停用
+     * @param row status 状态 true 已绑定 false 未绑定
+     */
+    disableAction(row) {
+
+    },   //列表查询
+    findPage() {
+      api.markList(this.queryform).then((res) => {
+        if (res.code == 200) {
+          this.Result = res;
+        }
+      })
+    },
+    // 同步用户
+    createBehavior() {
+      this.createBehaviorShow = true;
+      this.disabled = false;
+      this.form = {
+        actionId: "",
+        actionName: "",
+        markRules1: "",//规则
+        tagGroupId: "",//标签组id
+        tagGroupName: "",//标签组name
+        tagIdList: [],//标签列表
+        tagId: "",
+      }
+    },
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped>
+.customRules {
+  span {
+    color: #333;
+  }
+
+  .el-input {
+    width: 85px;
+    margin: 0 10px;
+  }
+}
+</style>

+ 174 - 0
src/views/customerOperation/userActionTypeConfig.vue

@@ -0,0 +1,174 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="queryform" label-width="100px" class="top-search">
+      <el-form-item label="行为类型名称">
+        <el-input v-model="queryform.name" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select v-model="queryform.delFlag" placeholder="请选择,支持关键词搜索" clearable filterable>
+          <el-option label="全部" value=""></el-option>
+          <el-option label="启用" value="0"></el-option>
+          <el-option label="停用" value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage()">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+      <div class="mid-action">
+        <el-button class="ml10" type="primary" @click="createBehavior">
+          新增
+        </el-button>
+      </div>
+      <templateTable ref="commonTable" :operationWidth="200" :showOperation="true" :showBatchDelete="false"
+        :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="viewDetails(row)">查看</el-button>
+          <el-button type="text" @click="disableAction(row)">{{ row.delFlag == 0 ? '禁用' : '启用' }}</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog :title="dialogTitle" :visible.sync="createBehaviorShow" width="40%">
+      <div>
+        <el-form ref="form" :rules="rules" :model="form" label-position="left" label-width="120px" :disabled="dialogType=='detail'?true:false">
+          <el-form-item label="行为类型名称" prop="name">
+            <el-input v-model="form.name" placeholder="请输入行为类型名称"></el-input>
+          </el-form-item>
+          <el-form-item label="行为描述" prop="description">
+            <el-input type="textarea" v-model="form.description"></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="createBehaviorShow = false">取 消</el-button>
+        <el-button type="primary" @click="userOperation">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import templateTable from "@/components/templateTable.vue";
+import * as api from '@/api/customerManage/userActionTypeConfig'
+
+export default {
+  components: {
+    templateTable
+  },
+  // 数据存放区域
+  data() {
+    return {
+      dialogTitle:"添加行为类型",
+      dialogType:'add',
+      createBehaviorShow: false,//转出弹窗
+      queryform: {
+        name: "",
+        delFlag: "",
+        pageNum: 1,
+        pageSize: 10,
+      },//页面检索对象
+      form: {
+        "name": "",
+        "description": "",
+      },//提交表单
+      rules: {
+        name: [
+          {
+            required: true,
+            message: '名称必填',
+            trigger: 'blur',
+          },
+        ],
+        description: [
+          {
+            required: true,
+            message: '行为描述必填',
+            trigger: 'blur',
+          },
+        ],
+      },
+      Result: {},
+      Columns: [
+        { prop: "code", label: "行为类型编码", minWidth: 180, },
+        { prop: "name", label: "行为类型名称", minWidth: 180, },
+        { prop: "description", label: "行为描述(选填)", minWidth: 360 },
+        { prop: "delFlag", label: "状态", minWidth: 120, formatter: this.delFlagFormatter },
+      ],
+    }
+  },
+  // 生命周期函数
+  created() {
+  },
+  // 方法函数
+  methods: {
+    delFlagFormatter(row) {
+      let delFlag = row.delFlag;
+      return delFlag == 0 ? '启用' : '禁用'
+    },
+    // 查看详情
+    viewDetails(row) {
+      this.dialogType='detail';
+      this.dialogTitle='详情';
+      this.createBehaviorShow = true;
+      this.form.name=row.name;
+      this.form.description=row.description;
+    },
+    // 操作用户
+    userOperation() {
+
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          api.behaviorAdd(this.form).then((res) => {
+            if (res.code == 200) {
+              this.createBehaviorShow = false;
+              this.$message({
+                type: 'success',
+                message: '添加成功'
+              });
+              this.findPage();
+            }
+
+          })
+        }
+      })
+    },
+    /**
+     * 停用
+     * @param row status 状态 true 已绑定 false 未绑定
+     */
+    disableAction(row) {
+      api.behaviorDisableEnable(row.id).then((res) => {
+        if (res.code == 200) {
+          this.$message({
+            type: 'success',
+            message: '操作成功'
+          });
+          this.findPage();
+        }
+      })
+    },   //列表查询
+    findPage() {
+      api.behaviorList(this.queryform).then((res) => {
+        if (res.code == 200) {
+          this.Result = res;
+        }
+      })
+    },
+    createBehavior(){
+      this.dialogType='add';
+      this.dialogTitle='添加行为类型';
+      this.createBehaviorShow = true;
+    },
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped></style>

+ 31 - 0
src/views/customerOperations/sop/detail.vue

@@ -0,0 +1,31 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+  <!-- 模板内容 -->
+
+  </div>
+  </template>
+
+  <!-- 行为区域 -->
+  <script>
+  export default {
+    // 数据存放区域
+    data () {
+      return {
+      }
+    },
+    // 生命周期函数
+    created () {
+    },
+    // 方法函数
+    methods: {
+    },
+    // 计算属性
+    computed: {
+    }
+  }
+  </script>
+  <!-- 样式区域 -->
+  <style lang='scss' scoped>
+
+  </style>

+ 498 - 0
src/views/customerOperations/sop/list.vue

@@ -0,0 +1,498 @@
+<!-- 模板区域 -->
+<template>
+  <div>
+    <!-- 模板内容 -->
+    <el-form ref="queryForm" :inline="true" :model="queryform" label-width="100px" class="top-search">
+      <el-form-item label="SOP名称">
+        <el-input v-model="queryform.sopName" placeholder="请输入"></el-input>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select v-model="queryform.sopStatus" placeholder="请选择,支持关键词搜索" clearable filterable>
+          <el-option label="全部" value=" "></el-option>
+          <el-option label="启用" value="1"></el-option>
+          <el-option label="停用" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="findPage()">查询</el-button>
+        <el-button @click="resetForm()">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="g-card  ">
+      <div class="mid-action">
+        <el-button class="ml10" type="primary" @click="sopAdd">
+          新建
+        </el-button>
+      </div>
+      <templateTable ref="commonTable" :operationWidth="200" :SerialShow="false" :showOperation="true"
+        :showBatchDelete="false" :data="Result" :columns="Columns" @findPage="findPage">
+        <template slot="buttonSlot" slot-scope="{ row }">
+          <el-button type="text" @click="sopEdit(row)">编辑</el-button>
+          <el-button type="text" @click="viewCopy(row)">复制</el-button>
+          <el-button type="text" @click="viewDel(row)">删除</el-button>
+          <el-button type="text" @click="viewEditStatus(row)">{{ row.sopStatus == 2 ? '启用' : '停用' }}</el-button>
+        </template>
+      </templateTable>
+    </div>
+    <el-dialog :title='dialogtitle' :visible.sync="sopAddShow" width="30%">
+      <div>
+        <el-form ref="form" :rules="rules" :model="form" label-width="120px">
+          <el-form-item label="SOP名称" prop="sopName">
+            <el-input v-model="form.sopName" placeholder="请输入SOP名称"></el-input>
+          </el-form-item>
+          <el-form-item label="场景描述" prop="sopDesc">
+            <el-input type="textarea" v-model="form.sopDesc" maxlength="200" show-word-limit
+              placeholder="请输入关键词"></el-input>
+          </el-form-item>
+          <el-form-item label="触发类型" prop="executeType">
+            <el-select v-model="form.executeType" placeholder="请选择" clearable filterable @change="executeTypeChange">
+              <el-option label="行为触发" :value="2"></el-option>
+              <el-option label="时间触发" :value="1"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="行为类型编码" :prop="form.executeType == '2' ? 'behaviorId' : ''">
+            <el-select v-model="form.behaviorId" placeholder="请选择" clearable filterable>
+              <el-option :label="item.name" :value="item.id" v-for="(item, index) in behaviorTypeList"
+                :key="index.id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间类型" prop="timeType" class=" ">
+            <el-radio-group v-model="form.timeType">
+              <el-radio :label="1">相对时间</el-radio>
+              <el-radio :label="2">绝对时间</el-radio>
+            </el-radio-group>
+            <i @click="addDomain" class="el-icon-circle-plus"
+              style="color: #07c160;font-size: 20px;margin-left: 20px"></i>
+          </el-form-item>
+          <el-form-item label="时间间隔" prop="relativeTime" v-if="form.timeType == 1">
+            <el-time-select v-model="relativeTime" :picker-options="{
+              start: '00:00',
+              step: '00:15',
+            }" placeholder="选择时间">
+            </el-time-select>
+          </el-form-item>
+          <el-form-item v-if="form.timeType == 2" v-for="domain in form.domains" :label="'选择日期'" :key="domain.key"
+            prop="absoluteTime">
+            <div class="flex a-c ">
+              <el-date-picker v-model="domain.absoluteTime" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
+                style="width: 70%;">
+              </el-date-picker>
+              <el-button @click.prevent="removeDomain(domain)" style="margin-left: 20px;">删除</el-button>
+            </div>
+          </el-form-item>
+          <el-form-item label="关联标签" prop="tagGroupId">
+            <el-select v-model="form.tagGroupId" placeholder="请选择" clearable filterable @change="tagsArrayChange">
+              <el-option v-for="(item, index) in tagsArray" :key="index" :label="item.groupName"
+                :value="item.id"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="关联标签" prop="tagId" v-if="form.tagGroupId">
+            <el-select v-model="form.tagIdlist" placeholder="请选择" clearable multiple>
+              <el-option :label="item.name" :value="item.id" v-for="(item, index) in tagsSubSet"
+                :key="index"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="关联素材" prop="materialId">
+            <el-select v-model="form.materialId" placeholder="请选择素材" clearable filterable>
+              <el-option :label="item.materialName" :value="item.id" v-for="(item, index) in aterialList"
+                :key="index"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="sopAddShow = false">取 消</el-button>
+        <el-button type="primary" @click="userOperation">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<!-- 行为区域 -->
+<script>
+import templateTable from "@/components/templateTable.vue";
+import * as userActionTypeApi from '@/api/customerManage/userActionTypeConfig'//获取行为类型数据
+import * as api from '@/api/sop/customerOperationsSop'
+
+export default {
+  components: {
+    templateTable
+  },
+  // 数据存放区域
+  data() {
+    return {
+      dialogtitle: "新建SOP规则",
+      dialogtype: "add",
+      relativeTime: "",
+      aterialList: [],//素材列表
+      tagsArray: [],//标签组列表
+      tagsSubSet: [],//标签列表
+      behaviorTypeList: [],
+      sopAddShow: false,//转出弹窗
+      queryform: {
+        sopName: "",
+        sopStatus: "",
+        pageNum: 1,
+        pageSize: 20,
+      },//页面检索对象
+      form: {
+        id: "",
+        sopName: "",//名称
+        sopDesc: "",//场景描述
+        executeType: "",//触发类型
+        behaviorId: "",//类型编码
+        timeType: 1,//时间类型
+        relativeTime: "",// 时间间隔
+        absoluteTime: "",//日期
+        tagGroupId: "",//标签组id
+        tagIdlist: [],//标签id数组
+        tagId: "",//标签id字符串
+        materialId: "",//素材id
+        domains: [{
+          absoluteTime: ''
+        }],
+      },//提交表单
+      rules: {
+        sopName: [
+          {
+            required: true,
+            message: '请输入名称',
+            trigger: 'blur',
+          },
+        ],
+        sopDesc: [
+          {
+            required: true,
+            message: '请输入描述',
+            trigger: 'blur',
+          },
+        ],
+        executeType: [
+          {
+            required: true,
+            message: '请选择触发类型',
+            trigger: 'chnage',
+          },
+        ],
+        behaviorId: [
+          {
+            required: true,
+            message: '请选择行为类型编码',
+            trigger: 'chnage',
+          },
+        ],
+        timeType: [
+          {
+            required: true,
+            message: '请选择时间类型',
+            trigger: 'chnage',
+          },
+        ],
+        relativeTime: [
+          {
+            required: true,
+            message: '请选择时间',
+            trigger: 'chnage',
+          },
+        ],
+        absoluteTime: [
+          {
+            required: true,
+            message: '请选择时间',
+            trigger: 'chnage',
+          },
+        ],
+        tagGroupId: [
+          {
+            required: true,
+            message: '请选择标签',
+            trigger: 'chnage',
+          },
+        ],
+        materialId: [
+          {
+            required: true,
+            message: '请选择素材',
+            trigger: 'chnage',
+          },
+        ],
+      },
+      Result: {
+
+      },
+      Columns: [
+        { prop: "id", label: "SOPID", minWidth: 180, },
+        { prop: "sopName", label: "SOP名称", minWidth: 180, },
+        { prop: "sopDesc", label: "场景描述", minWidth: 180 },
+        { prop: "executeType", label: "触发类型", minWidth: 180, formatter: this.executeTypeFormatter },
+        { prop: "tagName", label: "关联标签", minWidth: 180 },
+        { prop: "sopStatus", label: "启用状态", minWidth: 180, formatter: this.sopStatusFormatter },
+        { prop: "createTime", label: "创建时间", minWidth: 180 },
+      ],
+    }
+  },
+  // 生命周期函数
+  created() {
+    this.userActionType();//获取行为类型
+    this.fetchTags();
+    this.materialListNew();
+  },
+  // 方法函数
+
+  methods: {
+    //多日期添加
+    addDomain() {
+      this.form.domains.push({
+        absoluteTime: '',
+        key: Date.now()
+      });
+    },
+    //多个日期删除
+    removeDomain(item) {
+      var index = this.form.domains.indexOf(item)
+      if (index !== -1) {
+        this.form.domains.splice(index, 1)
+      }
+    },
+    //编辑
+    sopEdit(row) {
+      this.dialogtype = 'edit';
+      this.dialogtitle = '编辑SOP规则';
+      api.getSop(row.id).then((res) => {
+        if (res.code == 200) {
+          res.data.tagIdlist = res.data.data.tagId.split(',')
+          this.form.domains=res.data.data.absoluteTimeList;
+          this.relativeTime = this.secondsToTimeFormat(res.data.data.relativeTime)
+          Object.keys(this.form).forEach(key => {
+            if (res.data.data.hasOwnProperty(key)) {
+              this.form[key] = res.data.data[key];
+            }
+          });
+          this.tagsSubSet = this.tagsArray.find(val => val.id == res.data.data.tagGroupId).weTags;//获取对应标签组标签列表
+          this.sopAddShow = true;
+        }
+      })
+    },
+    //删除
+    viewDel(row) {
+      api.deleteSop(row.id).then((res) => {
+        if (res.code == 200) {
+          this.findPage();
+          this.$message({
+            type: 'success',
+            message: '删除成功!'
+          });
+        } else {
+          this.$message({
+            type: 'error',
+            message: res.msg,
+          });
+        }
+      })
+    },
+    //复制数据
+    viewCopy(row) {
+      api.copySop(row.id).then((res) => {
+        if (res.code == 200) {
+          this.findPage();
+          this.$message({
+            type: 'success',
+            message: '复制成功!'
+          });
+        } else {
+          this.$message({
+            type: 'error',
+            message: res.msg,
+          });
+        }
+      })
+    },
+    executeTypeFormatter(row) {
+      return row.executeType == 1 ? '时间触发' : '行为触发'
+    },
+    sopStatusFormatter(row) {
+      let sopStatus = row.sopStatus;
+      return sopStatus == 2 ? '停用' : '启用'
+    },
+    executeTypeChange() {
+      this.form.behaviorId = "";
+    },
+    //获取素材
+    materialListNew() {
+      api.materialListNew().then((res) => {
+        this.aterialList = res;
+      })
+    },
+    //获取对应标签组标签列表
+    tagsArrayChange(value) {
+      this.form.tagIdlist = [];//清空历史
+      this.tagsSubSet = this.tagsArray.find(val => val.id == value).weTags;
+    },
+    //获取标签组
+    fetchTags() {
+      api.tagList({
+        pageNum: 1,
+        pageSize: 100,
+        groupName: '',
+        groupTagType: 1,
+      }).then((res) => {
+        if (res.code == 200) {
+          this.tagsArray = res.rows;
+        }
+      })
+    },
+    userActionType() {
+      userActionTypeApi.behaviorList({
+        name: "",
+        delFlag: 0,
+        pageNum: 1,
+        pageSize: 10,
+      }).then((res) => {
+        if (res.code == 200) {
+          this.behaviorTypeList = res.rows;
+        }
+      })
+    },
+    // 启用/停用
+    viewEditStatus(row) {
+      api.disableStatus(row.id).then((res) => {
+        if (res.code == 200) {
+          this.findPage();
+          this.$message({
+            type: 'success',
+            message: '操作成功!'
+          });
+        } else {
+          this.$message({
+            type: 'error',
+            message: res.msg,
+          });
+        }
+      })
+    },
+    // 操作用户
+    userOperation() {
+      this.form.relativeTime = this.form.relativeTime ? this.convertTimeToSeconds(this.relativeTime) : '';
+      let list = [];
+      this.form.domains.map(val => {
+        list.push(val.absoluteTime)
+        return
+      })
+      this.form.absoluteTime = list;
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.form.tagId = this.form.tagIdlist.join(',');
+          if (this.dialogtype == 'add') {
+            api.addSop(this.form).then((res) => {
+              if (res.code == 200) {
+                this.sopAddShow = false;
+                this.findPage();
+                this.$message({
+                  type: 'success',
+                  message: '添加成功!'
+                });
+              }
+            })
+          } else {
+            api.updateSop(this.form).then((res) => {
+              if (res.code == 200) {
+                this.sopAddShow = false;
+                this.findPage();
+                this.$message({
+                  type: 'success',
+                  message: '编辑成功!'
+                });
+              }
+            })
+          }
+        }
+      })
+    },
+    /**
+     * 停用
+     * @param row status 状态 true 已绑定 false 未绑定
+     */
+    disableAction(row) {
+
+    },   //列表查询
+    findPage(data) {
+      if (data && data.pageRequest) {
+        this.queryform.pageNum = data.pageRequest.pageNum;
+        this.queryform.pageSize = data.pageRequest.pageSize;
+      }
+      api.listSop(this.queryform).then((res) => {
+        if (res.code == 200) {
+          this.Result = res;
+        }
+      })
+    },
+    // 同步用户
+    sopAdd() {
+      this.sopAddShow = true;
+      this.dialogtype = 'add';
+      this.dialogtitle = '新建SOP规则';
+      this.form = {
+        id: "",
+        sopName: "",//名称
+        sopDesc: "",//场景描述
+        executeType: "",//触发类型
+        behaviorId: "",//类型编码
+        timeType: 1,//时间类型
+        relativeTime: "",// 时间间隔
+        absoluteTime: "",//日期
+        tagGroupId: "",//标签组id
+        tagIdlist: [],//标签id数组
+        tagId: "",//标签id字符串
+        materialId: "",//素材id
+        domains: [{
+          value: ''
+        }],
+      }
+      this.relativeTime = "";
+    },
+    resetForm() {
+      this.queryform = {
+        sopName: "",
+        sopStatus: "",
+        pageNum: 1,
+        pageSize: 20,
+      }
+    },
+    // 时间转换成秒
+    convertTimeToSeconds(timeString) {
+      const [hours, minutes] = timeString.split(':').map(Number);//分解为时 和 分
+      // 计算总秒数
+      const totalSeconds = (hours * 3600) + (minutes * 60);
+      return totalSeconds;
+    },
+    //时分转换秒
+    secondsToTimeFormat(seconds) {
+      const hours = Math.floor(seconds / 3600); // 计算小时
+      const minutes = Math.floor((seconds % 3600) / 60); // 计算分钟
+      let timeString = '';
+      if (hours > 0 && hours < 10) {
+        timeString += `0${hours}:`;
+      } else if (hours > 10) {
+        timeString += `${hours}:`;
+      } else {
+        timeString += '00:'
+      }
+      if (minutes > 0 || hours > 0) {
+        if (minutes < 10) {
+          timeString += `0${minutes}`;
+
+        } else {
+          timeString += `${minutes}`;
+
+        }
+      }
+      return timeString;
+    }
+  },
+  // 计算属性
+  computed: {
+  }
+}
+</script>
+<!-- 样式区域 -->
+<style lang='scss' scoped></style>

+ 5 - 5
src/views/enterpriseManage/contacts/organization.vue

@@ -257,10 +257,10 @@ export default {
         dictvalue: dictvalue || "",
         comcode: comcode || "",
       };
-      await dictSelect(data).then((res) => {
-        console.log(res)
-        list = res.data
-      });
+      // await dictSelect(data).then((res) => {
+      //   console.log(res,1111111111111111111111111)
+      //   list = res.data
+      // });
       this.selectLoading = false
       return list;
     },
@@ -331,7 +331,7 @@ export default {
     submitDisposition() {
       if(!this.dispositionForm.comcode){
         this.msgError('请选择归属机构!')
-        return 
+        return
       }
       addUserDept(this.dispositionForm)
         .then((res) => {

+ 1 - 1
src/views/system/menu/index.vue

@@ -56,7 +56,7 @@
     </div>
 
     <!-- 添加或修改菜单对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body :close-on-click-modal="false">
+    <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body :close-on-click-modal="false">
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24">