Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

yusm 4 mesiacov pred
rodič
commit
696a8bad90
28 zmenil súbory, kde vykonal 600 pridanie a 96 odobranie
  1. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/index.html
  2. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/formForm/formItem.vue
  3. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/translationComponent.vue
  4. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/login.vue
  5. 16 11
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue
  6. 91 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue
  7. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/threadInfo.vue
  8. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataSummary.vue
  9. 5 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/addEditorVisitor.vue
  10. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js
  11. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue
  12. 17 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  13. 31 30
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java
  14. 0 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java
  15. 32 14
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  16. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java
  17. 9 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java
  18. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/SysDictMapper.java
  19. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java
  20. 36 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java
  21. 36 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java
  22. 23 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  23. 15 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java
  24. 50 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  25. 88 8
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  26. 50 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java
  27. 73 5
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  28. 7 0
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysDictMapper.xml

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/index.html

@@ -7,7 +7,7 @@
     <title>客户管家</title>
     <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
     <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
-    <!-- <script src="https://s.url.cn/qqun/qun/qqweb/m/qun/confession/js/vconsole.min.js "></script> -->
+    <script src="https://s.url.cn/qqun/qun/qqweb/m/qun/confession/js/vconsole.min.js "></script>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/formForm/formItem.vue

@@ -285,7 +285,7 @@ function requestData(str = "") {
         value: item[setProps.value || "value"],
       };
     });
-    props.element.options.options = newData
+    props.element.options.options = newData.length > 0 ? newData : [{}]
     if(distinguishComponents.value && fixedData.allUserData.length == 0) {
       fixedData.updateState({
         allUserData: [ ...newData ]

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/translationComponent.vue

@@ -1,5 +1,5 @@
 <template>
-  <!-- <template v-if="userInfo.userInfo.userNameNeedTranslate == 1">
+  <template v-if="userInfo.userInfo.userNameNeedTranslate == 1">
     <template v-if="Array.isArray(openId)">
       <template v-for="(item, index) in openId">
         <ww-open-data :type='type' :openid='item'></ww-open-data>
@@ -8,9 +8,9 @@
     </template>
     <ww-open-data :type='type' :openid='openId' v-else></ww-open-data>
   </template>
-  <template v-else> -->
+  <template v-else>
     {{ Array.isArray(openId) ? openId.join(',') : openId }}
-  <!-- </template> -->
+  </template>
 </template>
 
 <script setup>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/login.vue

@@ -148,7 +148,7 @@ function loginProcessing(data = {}) {
   router.switchTabBar({
     pathName: 'home',
     success: function () {
-      toastSuccess('登成功')
+      toastSuccess('登成功')
       setTimeout(() => {
         getMessageList()
       }, 500)

+ 16 - 11
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue

@@ -34,8 +34,9 @@
                             <div class="flex items-center flex-row mt-1">
                               <van-text-ellipsis :content="item.customerName"
                                 class="flex-1 text-[#B9B9B9] text-size-small" />
-                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:{{
-                                item.inchargerName }}</div>
+                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:
+                                <TranslationComponent :openId="item.inchargerName" />
+                              </div>
                             </div>
                           </div>
                         </template>
@@ -47,8 +48,9 @@
                               <div class="text-[#B9B9B9]">{{ item.customerLevelValue }}</div>
                             </div>
                             <div class="flex items-center flex-row mt-1">
-                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:{{
-                                item.inchargerName }}</div>
+                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:
+                                <TranslationComponent :openId="item.inchargerName" />
+                              </div>
                               <div></div>
                             </div>
                           </div>
@@ -61,8 +63,9 @@
                               <div class="text-[#B9B9B9]">{{ item.customerLevelValue }}</div>
                             </div>
                             <div class="flex items-center flex-row mt-1">
-                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:{{
-                                item.inchargerName }}</div>
+                              <div class="text-[#B9B9B9] text-size-small" v-if="item.inchargerName">负责人:
+                                <TranslationComponent :openId="item.inchargerName" />
+                              </div>
                               <div></div>
                             </div>
                           </div>
@@ -77,8 +80,9 @@
                             <div class="flex items-center justify-between flex-row mt-1">
                               <div class="text-[#B9B9B9] text-size-small w-2/5 truncate" v-if="item.ownerName">客户:{{
                                 item.customName }}</div>
-                              <div class="text-[#B9B9B9] text-size-small w-2/5 truncate text-right" v-if="item.ownerName">负责人:{{
-                                item.ownerName }}</div>
+                              <div class="text-[#B9B9B9] text-size-small w-2/5 truncate text-right" v-if="item.ownerName">负责人:  
+                                <TranslationComponent :openId="item.inchargerName" />
+                              </div>
                             </div>
                           </div>
                         </template>
@@ -109,8 +113,9 @@
                               <div class="text-[#B9B9B9]">{{ item.status ? '上架' : '下架' }}</div>
                             </div>
                             <div class="flex items-center justify-between flex-row mt-1">
-                              <div class="text-[#B9B9B9] text-size-small w-2/5 truncate">负责人:{{
-                                item.inchargerName }}</div>
+                              <div class="text-[#B9B9B9] text-size-small w-2/5 truncate">负责人:
+                                <TranslationComponent :openId="item.inchargerName" />
+                              </div>
                               <div class="text-[#B9B9B9] text-size-small w-2/5 truncate text-right">库存:{{
                                 item.unit || 0 }}</div>
                             </div>
@@ -360,7 +365,7 @@ function claimAndClaim(item) {
 // 删除事件
 function deleteRow(row) {
   const { name = '', searchFiled = {}, deteleFiled = '' } = queryParameters.value
-  const foemVal = { [queryParameters.value.key == 'tasks' ? 'taskIds' : 'ids']: row.id }
+  const foemVal = { [queryParameters.value.key == 'tasks' ? 'taskIds' : queryParameters.value.key == 'contract' ? 'id' : 'ids']: row.id }
   showConfirmDialog({
     title: `删除${name}`,
     message: `确定删除【${row[searchFiled?.search]}】${name}吗?`,

+ 91 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/detail.vue

@@ -29,10 +29,44 @@
       <van-cell title="联系人号码" :value="infoData.contactsPhone" v-if="!infoData.clueId" />
     </div>
     <div class="bottomButton">
-      <van-button type="success" class="w-full block" @click="completeTheTask(2)" v-if="infoData.status != 2">完成任务</van-button>
-      <van-button type="primary" class="w-full block" @click="completeTheTask(0)" v-if="infoData.status == 2">重启任务</van-button>
+      <van-button type="success" class="w-full block" @click="completeTheTask(2)"
+        v-if="infoData.status != 2">完成任务</van-button>
+      <!-- <van-button type="primary" class="w-full block" @click="completeTheTask(0)" v-if="infoData.status == 2">重启任务</van-button> -->
+      <van-button type="primary" class="w-full block" @click="restartTask()"
+        v-if="infoData.status == 2">重启任务</van-button>
       <van-button type="danger" class="w-full block" @click="deleteTask">删除任务</van-button>
     </div>
+
+    <van-popup v-model:show="showDelay" closeable position="bottom" round>
+      <div class="newModuleAdded relative">
+        <div class="text-size-large text-[#474A56] absolute topTitle">重启时间</div>
+        <div class="flex flex-col overflow-y-auto h-52">
+          <div class="flex-1">
+            <div class="px-6 py-4 bg-[#F8F8FA] flex justify-between items-center mt-2" @click="showDatePickerCli('showStartDelayData')">
+              <div>选择开始时间</div>
+              <div class="flex items-center">
+                {{ showStartDelayData }}
+                <van-icon name="arrow" size="1.2rem" class="ml-2" />
+              </div>
+            </div>
+          </div>
+          <div class="flex-1">
+            <div class="px-6 py-4 bg-[#F8F8FA] flex justify-between items-center mt-2" @click="showDatePickerCli('showEndtDelayData')">
+              <div>选择结束时间</div>
+              <div class="flex items-center">
+                {{ showEndtDelayData }}
+                <van-icon name="arrow" size="1.2rem" class="ml-2" />
+              </div>
+            </div>
+          </div>
+          <van-button type="primary" :disabled="showEndtDelayData < todaySDate" @click="delayTimeEvent()">重启</van-button>
+        </div>
+      </div>
+    </van-popup>
+
+    <van-popup v-model:show="showDatePicker" destroy-on-close position="bottom" :style="{ height: '50%' }">
+      <van-date-picker v-model="showDatePickerVal" @confirm="showPickerConfirm" @cancel="showDatePicker = false" />
+    </van-popup>
   </div>
 </template>
 
@@ -48,6 +82,7 @@ import { routingInfos } from "@utility/generalVariables"
 import useInfoStore from '@store/useInfoStore'
 import useFixedData from "@store/useFixedData.js"
 import useRouterStore from "@store/useRouterStore.js";
+import dayjs from 'dayjs';
 
 const router = useRouterStore()
 const fixedData = useFixedData()
@@ -63,11 +98,52 @@ const props = defineProps({
 const routingInformation = routingInfos['tasks']
 const infoData = ref(props.info);
 const timeout = ref(null);
+const showDelay = ref(false);
+const showDatePicker = ref(false);
+const showDatePickerVal = ref([])
+const todaySDate = dayjs(new Date()).format('YYYY-MM-DD')
+const showStartDelayData = ref('');
+const showEndtDelayData = ref('');
+const showDateType = ref('');
 
 watch(() => props.info, (newValue) => {
   initializeData(newValue.id)
 })
 
+function showPickerConfirm({ selectedValues }) {
+  const dates = selectedValues.join('-')
+  if(showDateType.value = 'showStartDelayData') {
+    showStartDelayData.value = dates
+  }
+
+  if(showDateType.value = 'showEndtDelayData') {
+    showEndtDelayData.value = dates
+  }
+
+  showDatePicker.value = false
+}
+
+function showDatePickerCli(type) {
+  showDateType.value = type
+  const types = type == 'showStartDelayData' ? showStartDelayData.value : showEndtDelayData.value
+  showDatePickerVal.value = types.split('-')
+  showDatePicker.value = true
+}
+
+function restartTask() {
+  showStartDelayData.value = infoData.value.startDate ? infoData.value.startDate : dayjs().format("YYYY-MM-DD")
+  showEndtDelayData.value = infoData.value.endDate ? infoData.value.endDate : dayjs().format("YYYY-MM-DD")
+  showDelay.value = true
+}
+function delayTimeEvent() {
+  const id = infoData.value.id
+  requests.post(TASK_OPERATION, { id, status: 0, startDate: showStartDelayData.value, endDate: showEndtDelayData.value }).then(({ data }) => {
+    toastSuccess('操作成功')
+    showDelay.value = false
+    getTaskDetails(id)
+  })
+}
+
 function completeTheTask(status) {
   const id = infoData.value.id
   requests.post(TASK_OPERATION, { id, status }).then(({ data }) => {
@@ -139,7 +215,20 @@ useLifecycle({
     margin-bottom: 20px;
   }
 }
+
 .info {
   margin: 8px 14px 30px 14px;
 }
+
+.newModuleAdded {
+  padding: 45px 25px 45px 25px;
+}
+
+.topTitle {
+  top: 14px;
+}
+
+.boxLxr {
+  max-height: 180px;
+}
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/thread/threadInfo.vue

@@ -140,7 +140,7 @@ function confirmTransfer() {
     return toastText('请选择要转移的人员')
   }
 
-  requests.post(TRANSFER_CLUES, { ids: props.info.id, inchargerId: dialogSelection.value.value }).then((res) => {
+  requests.post(TRANSFER_CLUES, { id: props.info.id, inchargerId: dialogSelection.value.value }).then((res) => {
     toastSuccess('转移成功')
     showDialog.value = false
     setTimeout(() => {

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/dataSummary.vue

@@ -20,7 +20,7 @@
                 {{ dataSummary?.customDataSummary?.newNum || 0 }}
               </span> 人
             </div>
-            <div class="text-size-small text-[#999]" style="width: 60%">
+            <div class="text-size-small text-[#999]" style="width: 60%" v-if="false">
               转成交客户 <span class="ml-1 text-[#FFBD27]">
                 {{ dataSummary?.closeDealNum?.newNum || 0 }}
               </span> 人
@@ -41,14 +41,14 @@
             </div>
             <div class="text-size-small text-[#999]" style="width: 60%;">
               商机赢单 <span class="ml-1 text-[#51C2FF]">
-                {{ dataSummary?.businessOpportunityDataSummary?.losting || 0 }}
+                {{ dataSummary?.businessOpportunityDataSummary?.winning || 0 }}
               </span> 个
             </div>
           </div>
           <div class="flex mt-2">
             <div class="text-size-small text-[#999]" style="width: 40%;">
               输单商机 <span class="ml-1 text-[#51C2FF]">
-                {{ dataSummary?.businessOpportunityDataSummary?.winning || 0 }}
+                {{ dataSummary?.businessOpportunityDataSummary?.losting || 0 }}
               </span> 个
             </div>
             <div class="text-size-small text-[#999]" style="width: 60%;">

+ 5 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/addEditorVisitor.vue

@@ -323,23 +323,26 @@ function processingDataSource(data) {
 
 function getAllCustomers() {
   requests.post(GET_ALL_CUSTOMERS, {}).then((res) => {
-    customerAllList.value = res.data.map((item) => {
+    const list = res.data.map((item) => {
       return {
         label: item.customName,
         value: item.id,
       };
     });
+    customerAllList.value = list.length > 0 ? list : [{}];
   });
 }
 
 function obtainThePurposeOfTheVisit() {
   requests.get(`${RETRIEVE_DICTIONARY_ENTRIES}?code=VisitGoal`).then((res) => {
-    purposeOfVisitList.value = res.data.map((item) => {
+    const list = res.data.map((item) => {
       return {
         label: item.name,
         value: item.id,
       };
     });
+
+    purposeOfVisitList.value = list.length > 0 ? list : [{}];
   });
 }
 

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/vite.config.js

@@ -7,8 +7,8 @@ import { postcssConfig } from "./postcss.config.js";
 
 // const target = 'http://192.168.2.7:10010';
 // const target = 'http://192.168.2.3:10010';
-const target = 'http://192.168.2.17:10010';
-// const target = 'http://47.101.180.183:10014';
+// const target = 'http://192.168.2.17:10010';
+const target = 'http://47.101.180.183:10014';
 
 export default defineConfig({
   define: {

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue

@@ -12,7 +12,7 @@
       <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
         <div class="tableHeader">
           <div>字典编码-{{ currentRow?.name }}</div>
-          <el-button type="primary" @click="showDialogFormVisible()" :disabled="!currentRow.id">新增参数</el-button>
+          <el-button type="primary" @click="showDialogFormVisible()" :disabled="!currentRow.id" v-if="currentRow?.name != '提醒类型'">新增参数</el-button>
         </div>
         <div class="flex-1 p-3">
           <el-table ref="dictionaryTableRef" :data="tableData" v-loading="AllLoading.tableDataLoading" border
@@ -20,7 +20,7 @@
             <el-table-column type="selection" width="55" />
             <el-table-column prop="name" label="字典名称" align="center" />
             <el-table-column prop="seq" label="排序" align="center" />
-            <el-table-column label="操作" width="100px">
+            <el-table-column label="操作" width="100px" v-if="currentRow?.name != '提醒类型'">
               <template #default="{ row, $index }">
                 <dv class="operation">
                   <el-icon @click="deteleItem(row)">

+ 17 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -253,8 +253,15 @@ public class BusinessOpportunityController {
         HttpRespMsg msg = new HttpRespMsg();
         if (bo.getId() == null){
             //新增
+            Integer count = businessOpportunityMapper.selectCount(new LambdaQueryWrapper<BusinessOpportunity>()
+                    .eq(BusinessOpportunity::getName, bo.getName())
+                    .eq(BusinessOpportunity::getCompanyId,user.getCompanyId())
+            );
+            if(count>0){
+                msg.setError("已存在同名商机");
+                return msg;
+            }
             if (bo.getClueId()!= null ){
-
                 clueMapper.update(null, new UpdateWrapper<Clue>().eq("id",bo.getClueId()).set("is_bo",1));
             }
             bo.setCompanyId(user.getCompanyId());
@@ -282,6 +289,15 @@ public class BusinessOpportunityController {
             bOservice.insert(bo);
         }else {
             //修改
+            Integer count = businessOpportunityMapper.selectCount(new LambdaQueryWrapper<BusinessOpportunity>()
+                    .eq(BusinessOpportunity::getName, bo.getName())
+                    .eq(BusinessOpportunity::getCompanyId,user.getCompanyId())
+                    .ne(BusinessOpportunity::getId,bo.getId())
+            );
+            if(count>0){
+                msg.setError("已存在同名商机");
+                return msg;
+            }
             bo.setEditTime(new Date());
             bOservice.update(bo,user.getId());
 

+ 31 - 30
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ClueController.java

@@ -282,36 +282,37 @@ public class ClueController {
     @RequestMapping("/insertAndUpdate")
     public Object inserANdUpdate(Clue clue, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
-        if (clue.getClueName() == null && clue.getClueName().trim().equals("")){
-            msg.setError("请填写名称");
-            return msg;
-        }
-        //操作前校验
-        User user = userMapper.selectById(request.getHeader("Token"));
-        if (user == null) {
-            msg.setError("获取创建人失败");
-            return msg;
-        }
-        clue.setCompanyId(user.getCompanyId());
-        if (null == clue.getClueName() || "".equals(clue.getClueName())) {
-            msg.setError("线索名称不能为空");
-            return msg;
-        }
-        if (null == clue.getClueSourceId()) {
-            msg.setError("线索来源不能为空");
-            return msg;
-        }
-        clue.setIsDelete(0);
-        if (null != clue.getId()) {
-            //修改
-            clueService.update(clue);
-            msg.setMsg("操作成功");
-        } else {
-            //新增
-            clue.setCreateId(user.getId());
-            clueService.insert(clue);
-            msg.setMsg("操作成功");
-        }
+//        if (clue.getClueName() == null && clue.getClueName().trim().equals("")){
+//            msg.setError("请填写名称");
+//            return msg;
+//        }
+//        //操作前校验
+//        User user = userMapper.selectById(request.getHeader("Token"));
+//        if (user == null) {
+//            msg.setError("获取创建人失败");
+//            return msg;
+//        }
+//        clue.setCompanyId(user.getCompanyId());
+//        if (null == clue.getClueName() || "".equals(clue.getClueName())) {
+//            msg.setError("线索名称不能为空");
+//            return msg;
+//        }
+//        if (null == clue.getClueSourceId()) {
+//            msg.setError("线索来源不能为空");
+//            return msg;
+//        }
+//        clue.setIsDelete(0);
+//        if (null != clue.getId()) {
+//            //修改
+//            clueService.update(clue);
+//            msg.setMsg("操作成功");
+//        } else {
+//            //新增
+//            clue.setCreateId(user.getId());
+//            clueService.insert(clue);
+//            msg.setMsg("操作成功");
+//        }
+        msg = clueService.insertAndUpdate(clue,request);
         return msg;
     }
 

+ 0 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java

@@ -606,7 +606,6 @@ public class SalesOrderController {
     * @Date: 2024/5/31
     */
     @RequestMapping("/deletePayment")
-    @Transactional
     public HttpRespMsg deletePayment(Integer paymentId){
         HttpRespMsg msg=new HttpRespMsg();
         SalesOrderPayment payment = salesOrderPaymentService.getById(paymentId);

+ 32 - 14
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -3,11 +3,6 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.dingtalk.api.DefaultDingTalkClient;
-import com.dingtalk.api.DingTalkClient;
-import com.dingtalk.api.request.OapiV2DepartmentListsubRequest;
-import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
-import com.google.gson.JsonObject;
 import com.management.platform.constant.Constant;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.UserVO;
@@ -15,16 +10,13 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.service.impl.ExcelExportServiceImpl;
 import com.management.platform.service.impl.ReportServiceImpl;
-import com.management.platform.service.impl.TaskServiceImpl;
 import com.management.platform.service.impl.UserServiceImpl;
 import com.management.platform.util.*;
 import com.qq.weixin.mp.aes.AesException;
 import com.qq.weixin.mp.aes.WXBizMsgCrypt;
 import com.taobao.api.ApiException;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.annotations.Select;
 import org.json.XML;
-import org.junit.Test;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -38,15 +30,12 @@ import org.springframework.web.servlet.view.RedirectView;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.net.URLEncoder;
-import java.sql.Timestamp;
-import java.time.*;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Function;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @RestController
 @RequestMapping("/wxcorp")
@@ -172,6 +161,9 @@ public class WeiXinCorpController {
     @Resource
     private StageService stageService;
 
+    @Resource
+    private SysDictService sysDictService;
+
     public static String SUITE_ACCESS_TOKEN = null;
     public static long suiteTokenExpireTime = 0L;
 
@@ -1335,6 +1327,32 @@ public class WeiXinCorpController {
                         company.setRegFrom("企业微信");
                         companyMapper.insert(company);
 
+                        List<SysDict> originalDictList = new ArrayList<>();
+                        SysDict goalDict1 = new SysDict("VisitGoal","建立客情",1,company.getId());
+                        SysDict goalDict2 = new SysDict("VisitGoal","收集客户信息",2,company.getId());
+                        SysDict goalDict3 = new SysDict("VisitGoal","了解客户需求",3,company.getId());
+                        SysDict goalDict4 = new SysDict("VisitGoal","方案沟通",4,company.getId());
+                        SysDict goalDict5 = new SysDict("VisitGoal","商务谈判",5,company.getId());
+                        SysDict goalDict6 = new SysDict("VisitGoal","促单",6,company.getId());
+                        SysDict goalDict7 = new SysDict("VisitGoal","签约",7,company.getId());
+                        SysDict goalDict8 = new SysDict("VisitGoal","客户服务",8,company.getId());
+                        originalDictList.add(goalDict1);originalDictList.add(goalDict2);originalDictList.add(goalDict3);
+                        originalDictList.add(goalDict4);originalDictList.add(goalDict5);originalDictList.add(goalDict6);
+                        originalDictList.add(goalDict7);originalDictList.add(goalDict8);
+
+                        SysDict remindDict1 = new SysDict("RemindType","不提醒",1,company.getId());
+                        SysDict remindDict2 = new SysDict("RemindType","提前5分钟",2,company.getId());remindDict2.setExt1("300");
+                        SysDict remindDict3 = new SysDict("RemindType","提前10分钟",3,company.getId());remindDict3.setExt1("600");
+                        SysDict remindDict4 = new SysDict("RemindType","提前20分钟",4,company.getId());remindDict4.setExt1("1200");
+                        SysDict remindDict5 = new SysDict("RemindType","提前1小时",5,company.getId());remindDict5.setExt1("3600");
+                        SysDict remindDict6 = new SysDict("RemindType","提前1天",6,company.getId());remindDict6.setExt1("86400");
+                        SysDict remindDict7 = new SysDict("RemindType","提前3天",7,company.getId());remindDict7.setExt1("259200");
+                        SysDict remindDict8 = new SysDict("RemindType","提前1周",8,company.getId());remindDict8.setExt1("604800");
+                        originalDictList.add(remindDict1);originalDictList.add(remindDict2);originalDictList.add(remindDict3);
+                        originalDictList.add(remindDict4);originalDictList.add(remindDict5);originalDictList.add(remindDict6);
+                        originalDictList.add(remindDict7);originalDictList.add(remindDict8);
+                        sysDictService.saveBatch(originalDictList);
+
                         //设置默认表单配置
                         List<SysForm> baseList = getBaseList();
                         Company finalCompany = company;

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/BusinessOpportunity.java

@@ -39,7 +39,7 @@ public class BusinessOpportunity extends Model<BusinessOpportunity> {
 
     @TableField(exist = false)
     private String productName;
-    @TableField(exist = false)
+    @TableField("clue_id")
     private Integer clueId;
 
     /**

+ 9 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SysDict.java

@@ -60,6 +60,15 @@ public class SysDict extends Model<SysDict> {
     @TableField("ext3")
     private String ext3;
 
+    public SysDict(String code, String name, Integer seq, Integer companyId) {
+        this.code = code;
+        this.name = name;
+        this.seq = seq;
+        this.companyId = companyId;
+    }
+
+    public SysDict() {
+    }
 
     @Override
     protected Serializable pkVal() {

+ 4 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/mapper/SysDictMapper.java

@@ -2,6 +2,9 @@ package com.management.platform.mapper;
 
 import com.management.platform.entity.SysDict;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface SysDictMapper extends BaseMapper<SysDict> {
 
+    void batchInsertDict(@Param("dicts") List<SysDict> originalDictList);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ClueService.java

@@ -66,4 +66,6 @@ public interface ClueService extends IService<Clue> {
     HttpRespMsg pinClue(Clue clue, HttpServletRequest request);
 
     HttpRespMsg undoPin(Clue clue, HttpServletRequest request);
+
+    HttpRespMsg insertAndUpdate(Clue clue, HttpServletRequest request);
 }

+ 36 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ClueServiceImpl.java

@@ -688,5 +688,41 @@ public class ClueServiceImpl extends ServiceImpl<ClueMapper, Clue> implements Cl
         return respMsg;
     }
 
+    @Override
+    public HttpRespMsg insertAndUpdate(Clue clue, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (clue.getClueName() == null && clue.getClueName().trim().equals("")){
+            msg.setError("请填写名称");
+            return msg;
+        }
+        //操作前校验
+        User user = userMapper.selectById(request.getHeader("Token"));
+        if (user == null) {
+            msg.setError("获取创建人失败");
+            return msg;
+        }
+        clue.setCompanyId(user.getCompanyId());
+        if (null == clue.getClueName() || "".equals(clue.getClueName())) {
+            msg.setError("线索名称不能为空");
+            return msg;
+        }
+        if (null == clue.getClueSourceId()) {
+            msg.setError("线索来源不能为空");
+            return msg;
+        }
+        clue.setIsDelete(0);
+        if (null != clue.getId()) {
+            //修改
+            clueMapper.updateById(clue);
+            msg.setMsg("操作成功");
+        } else {
+            //新增
+            clue.setCreateId(user.getId());
+            clueMapper.insert(clue);
+            msg.setMsg("操作成功");
+        }
+        return msg;
+    }
+
 
 }

+ 36 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContactsServiceImpl.java

@@ -92,6 +92,12 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
     @Value(value = "${upload.path}")
     private String path;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -887,10 +893,40 @@ public class ContactsServiceImpl extends ServiceImpl<ContactsMapper, Contacts> i
         }
 
         Page<ContactsVo> pageContacts = contactsMapper.pageContactsByPin(new Page( pageIndex, pageSize), map);
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+        Map<String, User> companyUserMap = new HashMap<>();
+        if(CollectionUtils.isNotEmpty(userList)){
+            companyUserMap  = userList.stream().collect(Collectors.toMap(User::getId, t -> t));
+        }
 
         List<ContactsVo> records = pageContacts.getRecords();
         long total = pageContacts.getTotal();
 
+        for (ContactsVo record : records) {
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                User ownUser = companyUserMap.getOrDefault(record.getOwnerId(), null);
+                if(null != ownUser){
+                    record.setOwnerName("$username="+ownUser.getCorpwxUserid()+"$");
+                }
+                User createUser = companyUserMap.getOrDefault(record.getCreatorId(), null);
+                if(null != createUser){
+                    record.setCreatorName("$username="+createUser.getCorpwxUserid()+"$");
+                }
+            }
+//            else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                User ownUser = companyUserMap.getOrDefault(record.getOwnerId(), null);
+//                if(null != ownUser){
+//                    record.setOwnerName("$username="+ownUser.getDingdingUserid()+"$");
+//                }
+//                User createUser = companyUserMap.getOrDefault(record.getCreatorId(), null);
+//                if(null != createUser){
+//                    record.setCreatorName("$username="+createUser.getDingdingUserid()+"$");
+//                }
+//            }
+        }
+
         HashMap<String, Object> hashMap = new HashMap<>();
         hashMap.put("records", records);
         hashMap.put("total", total);

+ 23 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -16,6 +16,7 @@ import com.management.platform.service.SysDictService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.EncryptedDocumentException;
@@ -87,6 +88,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     @Resource
     private SysDictService sysDictService;
 
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
 
 
     /**
@@ -1529,6 +1533,13 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             User user = userMapper.selectById(token);
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
             List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部合同");
+//            CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+            List<User> companyUserList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+            Map<String, User> companyUserMap = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(companyUserList)){
+                companyUserMap  = companyUserList.stream().collect(Collectors.toMap(User::getId, t -> t));
+            }
+
             if(functionContractList.size() <= 0){
                 httpRespMsg.setError(MessageUtils.message("access.viewError"));
                 return httpRespMsg;
@@ -1590,7 +1601,18 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 contractPageVO.setId(contract.getId());
                 contractPageVO.setCompanyId(contract.getCompanyId());
                 contractPageVO.setCreatorId(contract.getCreatorId());
-                contractPageVO.setCreatorName(contract.getCreatorName());
+                User tmpUser = companyUserMap.getOrDefault(contract.getCreatorId(),null);
+                if(null != tmpUser){
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        contractPageVO.setCreatorName("$username="+tmpUser.getCorpwxUserid()+"$");
+                    }
+//                    else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                        contractPageVO.setCreatorName("$username="+tmpUser.getDingdingUserid()+"$");
+//                    }
+                    else{
+                        contractPageVO.setCreatorName(contract.getCreatorName());
+                    }
+                }
                 contractPageVO.setCreatorWxCorpId(contract.getCreatorWxCorpId());
                 contractPageVO.setStartDate(contract.getStartDate());
                 contractPageVO.setEndDate(contract.getEndDate());

+ 15 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/CustomServiceImpl.java

@@ -94,6 +94,12 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
     @Autowired
     private TaskMapper taskMapper;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
     @Override
     public HttpRespMsg insertAndUpdate(Custom custom, HttpServletRequest request) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -107,6 +113,7 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
         if (custom.getId() != null) {
             Custom custom1 = customMapper.selectById(custom.getId());
             if (customMapper.selectCount(new QueryWrapper<Custom>()
+                    .eq("company_id",user.getCompanyId())
                     .eq("custom_name", custom.getCustomName())
                     .ne("custom_name", custom1.getCustomName())) > 0) {
                 msg.setError("客户名称重复了");
@@ -114,12 +121,14 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
             }
             if (customMapper.selectCount(new QueryWrapper<Custom>()
                     .eq("tel_phone", custom.getTelPhone())
+                    .eq("company_id",user.getCompanyId())
                     .ne("tel_phone", custom1.getTelPhone())
             ) > 0) {
                 msg.setError("电话号码重复了");
                 return msg;
             } if (customMapper.selectCount(new QueryWrapper<Custom>()
                     .eq("company_phone", custom.getCompanyPhone())
+                    .eq("company_id",user.getCompanyId())
                     .ne("company_phone", custom1.getCompanyPhone())
             ) > 0) {
                 msg.setError("电话号码重复了");
@@ -134,11 +143,15 @@ public class CustomServiceImpl extends ServiceImpl<CustomMapper, Custom> impleme
             actionLogMapper.insert(actionLog);
             customMapper.updateById(custom);
         } else {
-            if (customMapper.selectCount(new QueryWrapper<Custom>().eq("custom_name", custom.getCustomName())) > 0) {
+            if (customMapper.selectCount(new QueryWrapper<Custom>().eq("custom_name", custom.getCustomName())
+                    .eq("company_id",user.getCompanyId())
+            ) > 0) {
                 msg.setError("客户名称重复了");
                 return msg;
             }
-            if (customMapper.selectCount(new QueryWrapper<Custom>().eq("tel_phone", custom.getTelPhone())) > 0) {
+            if (customMapper.selectCount(new QueryWrapper<Custom>().eq("tel_phone", custom.getTelPhone())
+                    .eq("company_id",user.getCompanyId())
+            ) > 0) {
                 msg.setError("电话号码重复了");
                 return msg;
             }

+ 50 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -74,6 +75,12 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     @Resource
     private AttachmentCenterMapper attachmentCenterMapper;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
     @Override
     public HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode,Integer productType,Integer status,String startDate,String endDate, Integer pageIndex, Integer pageSize) {
         HttpRespMsg msg=new HttpRespMsg();
@@ -87,6 +94,10 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
         boolean hasPriviledgeAll = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看全部产品数据");
         boolean hasPriviledgeDept = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看负责部门产品数据");
+
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", targetUsr.getCompanyId()));
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, targetUsr.getCompanyId()));
+
         //判断查看全部的权限
         if(!hasPriviledgeAll){
             //判断查看负责部门的权限
@@ -150,11 +161,27 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         records.forEach(r->{
             Optional<User> user = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
             if(user.isPresent()){
-                r.setInchargerName(user.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCreatorName("$username="+user.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCreatorName("$username="+user.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setInchargerName(user.get().getName());
+                }
             }
             Optional<User> creator = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
             if(creator.isPresent()){
-                r.setCreatorName(creator.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCreatorName("$username="+creator.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCreatorName("$username="+creator.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCreatorName(creator.get().getName());
+                }
             }
             Optional<SysDict> unit = sysDictOfProductUnit.stream().filter(u -> u.getId().equals(r.getUnit())).findFirst();
             if(unit.isPresent()){
@@ -636,6 +663,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
         boolean hasPriviledgeAll = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看全部产品数据");
         boolean hasPriviledgeDept = sysFunctionService.hasPriviledge(targetUsr.getRoleId(), "查看负责部门产品数据");
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", targetUsr.getCompanyId()));
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, targetUsr.getCompanyId()));
+
         //判断查看全部的权限
         if(!hasPriviledgeAll){
             //判断查看负责部门的权限
@@ -699,11 +729,27 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         records.forEach(r->{
             Optional<User> user = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
             if(user.isPresent()){
-                r.setInchargerName(user.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setInchargerName("$username="+user.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setInchargerName("$username="+user.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setInchargerName(user.get().getName());
+                }
             }
             Optional<User> creator = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
             if(creator.isPresent()){
-                r.setCreatorName(creator.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCreatorName("$username="+creator.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCreatorName("$username="+creator.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCreatorName(creator.get().getName());
+                }
             }
             Optional<SysDict> unit = sysDictOfProductUnit.stream().filter(u -> u.getId().equals(r.getUnit())).findFirst();
             if(unit.isPresent()){

+ 88 - 8
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -88,6 +89,12 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     @Value(value = "${upload.path}")
     private String path;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
     @Override
     public HttpRespMsg getList(String inchargerId,Integer orderType, String orderName,
                                String orderCode,Integer customId,String businessName,
@@ -102,6 +109,10 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         LambdaQueryWrapper<SalesOrder> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
         List<Custom> customList = customService.list(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, user.getCompanyId()));
         List<BusinessOpportunity> businessOpportunityList = businessOpportunityService.list(new LambdaQueryWrapper<BusinessOpportunity>().eq(BusinessOpportunity::getCompanyId, user.getCompanyId()));
+
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+
         orderLambdaQueryWrapper.eq(SalesOrder::getCompanyId,user.getCompanyId());
         if(isDelete!=null){
             orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,isDelete);
@@ -198,19 +209,51 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         records.forEach(r->{
             Optional<User> item = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
             if(item.isPresent()){
-                r.setCreatorName(item.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCreatorName("$username="+item.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCreatorName("$username="+item.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCreatorName(item.get().getName());
+                }
             }
             Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
             if(incharger.isPresent()){
-                r.setInchargerName(incharger.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setInchargerName("$username="+incharger.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setInchargerName("$username="+incharger.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setInchargerName(incharger.get().getName());
+                }
             }
             Optional<User> companySigner = userList.stream().filter(u -> u.getId().equals(r.getCompanySigner())).findFirst();
             if(companySigner.isPresent()){
-                r.setCompanySignerName(companySigner.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCompanySignerName("$username="+companySigner.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCompanySignerName("$username="+companySigner.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCompanySignerName(companySigner.get().getName());
+                }
             }
             Optional<User> customSigner = userList.stream().filter(u -> u.getId().equals(r.getCustomSigner())).findFirst();
             if(customSigner.isPresent()){
-                r.setCustomSignerName(customSigner.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCustomSignerName("$username="+customSigner.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCustomSignerName("$username="+customSigner.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCustomSignerName(customSigner.get().getName());
+                }
             }
             Optional<SysDict> type = sysDictOfOrderType.stream().filter(s -> s.getId().equals(r.getType())).findFirst();
             if(type.isPresent()){
@@ -295,6 +338,9 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         LambdaQueryWrapper<SalesOrder> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();
         List<Custom> customList = customService.list(new LambdaQueryWrapper<Custom>().eq(Custom::getCompanyId, user.getCompanyId()));
         List<BusinessOpportunity> businessOpportunityList = businessOpportunityService.list(new LambdaQueryWrapper<BusinessOpportunity>().eq(BusinessOpportunity::getCompanyId, user.getCompanyId()));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+//        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+
         orderLambdaQueryWrapper.eq(SalesOrder::getCompanyId,user.getCompanyId());
         if(isDelete!=null){
             orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,isDelete);
@@ -397,19 +443,53 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         records.forEach(r->{
             Optional<User> item = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
             if(item.isPresent()){
-                r.setCreatorName(item.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCreatorName("$username="+item.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCreatorName("$username="+item.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCreatorName(item.get().getName());
+                }
+
             }
             Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(r.getInchargerId())).findFirst();
             if(incharger.isPresent()){
-                r.setInchargerName(incharger.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setInchargerName("$username="+incharger.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setInchargerName("$username="+incharger.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setInchargerName(incharger.get().getName());
+                }
+
             }
             Optional<User> companySigner = userList.stream().filter(u -> u.getId().equals(r.getCompanySigner())).findFirst();
             if(companySigner.isPresent()){
-                r.setCompanySignerName(companySigner.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCompanySignerName("$username="+companySigner.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCompanySignerName("$username="+companySigner.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCompanySignerName(companySigner.get().getName());
+                }
             }
             Optional<User> customSigner = userList.stream().filter(u -> u.getId().equals(r.getCustomSigner())).findFirst();
             if(customSigner.isPresent()){
-                r.setCustomSignerName(customSigner.get().getName());
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    r.setCustomSignerName("$username="+customSigner.get().getCorpwxUserid()+"$");
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    r.setCustomSignerName("$username="+customSigner.get().getDingdingUserid()+"$");
+//                }
+                else{
+                    r.setCustomSignerName(customSigner.get().getName());
+                }
             }
             Optional<SysDict> type = sysDictOfOrderType.stream().filter(s -> s.getId().equals(r.getType())).findFirst();
             if(type.isPresent()){

+ 50 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/TaskServiceImpl.java

@@ -14,6 +14,7 @@ import com.management.platform.mapper.*;
 import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.CellType;
 import org.apache.poi.xssf.usermodel.XSSFCell;
@@ -112,6 +113,9 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
 
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -1228,6 +1232,14 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         boolean isAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部任务");
         boolean isNotAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看负责部门任务");
 
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, user.getCompanyId()));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+        Map<String, User> companyUserMap = new HashMap<>();
+        if(CollectionUtils.isNotEmpty(userList)){
+            companyUserMap  = userList.stream().collect(Collectors.toMap(User::getId, t -> t));
+        }
+
         if (isAll){
             System.out.println("do nothing");
         }else if (isNotAll){
@@ -1241,6 +1253,18 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
 
         List<TasKVo> taskVoList =taskMapper.getPageListTaskByPin(taskDto);
         for (TasKVo tasKVo : taskVoList) {
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                User tmpUser = companyUserMap.getOrDefault(tasKVo.getCreaterId(), null);
+                if(null != tmpUser){
+                    tasKVo.setCreaterName("$username="+tmpUser.getCorpwxUserid()+"$");
+                }
+            }
+//            else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                User tmpUser = companyUserMap.getOrDefault(tasKVo.getCreaterId(), null);
+//                if(null != tmpUser){
+//                    tasKVo.setCreaterName("$username="+tmpUser.getDingdingUserid()+"$");
+//                }
+//            }
             if (!taskExecutorList.isEmpty()){
                 List<TaskExecutor> collect = taskExecutorList.stream().
                         filter(taskExecutor -> taskExecutor.getTaskId().equals(tasKVo.getId())).
@@ -1298,8 +1322,34 @@ public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task> implements Ta
         HttpRespMsg respMsg = new HttpRespMsg();
         TasKVo tasKVo = new TasKVo();
         Task task = taskMapper.selectById(id);
+        User user = userMapper.selectById(request.getHeader("Token"));
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+
         if (task!=null){
             BeanUtils.copyProperties(task,tasKVo);
+            List<String> queryIds = new ArrayList<>();
+            queryIds.add(task.getOwnerId());
+            queryIds.add(task.getCreaterId());
+            Map<String, User> companyUserMap = new HashMap<>();
+            if(CollectionUtils.isNotEmpty(queryIds)){
+                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getId, queryIds));
+                if(CollectionUtils.isNotEmpty(users)){
+                    companyUserMap  = users.stream().collect(Collectors.toMap(User::getId, t -> t));
+                }
+            }
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                User createUser = companyUserMap.getOrDefault(task.getCreaterId(), null);
+                if(null != createUser){
+                    task.setCreaterName("$username="+createUser.getCorpwxUserid()+"$");
+                }
+            }
+//            else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                User createUser = companyUserMap.getOrDefault(task.getCreaterId(), null);
+//                if(null != createUser){
+//                    task.setCreaterName("$username="+createUser.getDingdingUserid()+"$");
+//                }
+//            }
             if (task.getContactsId()!=null){
                 Contacts contacts = contactsMapper.selectById(task.getContactsId());
                 if (contacts!=null){

+ 73 - 5
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.constant.Constant;
-import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.entity.vo.UserVO;
@@ -22,8 +21,6 @@ import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
-import org.apache.commons.collections4.Put;
-import org.apache.commons.io.FileUtils;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.poi.hssf.usermodel.*;
@@ -36,12 +33,13 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.*;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.ldap.core.LdapTemplate;
 import org.springframework.ldap.filter.EqualsFilter;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.ModelAndView;
@@ -229,11 +227,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @Resource
     private StageService stageService;
 
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+
     @Resource
     private LdapTemplate ldapTemplate;
 
     public static String provider_access_token = null;
     public static long providerTokenExpireTime = 0L;
+    @Resource
+    private SysDictMapper sysDictMapper;
+
+    @Resource
+    private SysDictService sysDictService;
+
     //登录网页端
     @Override
     public HttpRespMsg loginAdmin(String username, String password){
@@ -1125,6 +1132,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             company.setRegFrom(from);
             companyMapper.insert(company);
 
+            List<SysDict> originalDictList = new ArrayList<>();
+            SysDict goalDict1 = new SysDict("VisitGoal","建立客情",1,company.getId());
+            SysDict goalDict2 = new SysDict("VisitGoal","收集客户信息",2,company.getId());
+            SysDict goalDict3 = new SysDict("VisitGoal","了解客户需求",3,company.getId());
+            SysDict goalDict4 = new SysDict("VisitGoal","方案沟通",4,company.getId());
+            SysDict goalDict5 = new SysDict("VisitGoal","商务谈判",5,company.getId());
+            SysDict goalDict6 = new SysDict("VisitGoal","促单",6,company.getId());
+            SysDict goalDict7 = new SysDict("VisitGoal","签约",7,company.getId());
+            SysDict goalDict8 = new SysDict("VisitGoal","客户服务",8,company.getId());
+            originalDictList.add(goalDict1);originalDictList.add(goalDict2);originalDictList.add(goalDict3);
+            originalDictList.add(goalDict4);originalDictList.add(goalDict5);originalDictList.add(goalDict6);
+            originalDictList.add(goalDict7);originalDictList.add(goalDict8);
+
+            SysDict remindDict1 = new SysDict("RemindType","不提醒",1,company.getId());
+            SysDict remindDict2 = new SysDict("RemindType","提前5分钟",2,company.getId());remindDict2.setExt1("300");
+            SysDict remindDict3 = new SysDict("RemindType","提前10分钟",3,company.getId());remindDict3.setExt1("600");
+            SysDict remindDict4 = new SysDict("RemindType","提前20分钟",4,company.getId());remindDict4.setExt1("1200");
+            SysDict remindDict5 = new SysDict("RemindType","提前1小时",5,company.getId());remindDict5.setExt1("3600");
+            SysDict remindDict6 = new SysDict("RemindType","提前1天",6,company.getId());remindDict6.setExt1("86400");
+            SysDict remindDict7 = new SysDict("RemindType","提前3天",7,company.getId());remindDict7.setExt1("259200");
+            SysDict remindDict8 = new SysDict("RemindType","提前1周",8,company.getId());remindDict8.setExt1("604800");
+            originalDictList.add(remindDict1);originalDictList.add(remindDict2);originalDictList.add(remindDict3);
+            originalDictList.add(remindDict4);originalDictList.add(remindDict5);originalDictList.add(remindDict6);
+            originalDictList.add(remindDict7);originalDictList.add(remindDict8);
+
+//            sysDictMapper.batchInsertDict(originalDictList);
+            sysDictService.saveBatch(originalDictList);
+
             List<SysForm> baseList = getBaseList();
             baseList.forEach(b->{
                 b.setCompanyId(company.getId());
@@ -1935,6 +1970,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         //企业微信通讯录搜索功能
         Integer WXCompanyId = user.getCompanyId();
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", WXCompanyId));
+
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
+
+        List<User> companyUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));
+        Map<String, User> companyUserMap = companyUsers.stream().collect(Collectors.toMap(User::getId, t -> t));
         //当企业开启了微信通讯录的情况下
         if (org.apache.commons.lang3.StringUtils.isNotBlank(keyword) && wxCorpInfo!=null && wxCorpInfo.getSaasSyncContact()==1){
             HashMap<String, List> result = wxCorpInfoService.getOpenId(wxCorpInfo.getCorpid(), keyword, cursor,1,200);
@@ -1946,6 +1986,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             if (users.size()!=0){
 //                List<User> realUser = userMapper.selectList(new QueryWrapper<User>().in("corpwx_userid", users));
                 List<Map<String,Object>> realUser = userMapper.selectListSimple(users);
+                for (Map<String, Object> map : realUser) {
+                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                        User tmpUser = companyUserMap.getOrDefault(map.get("value"),null);
+                        if(null != tmpUser){
+                            map.put("label","$username="+tmpUser.getCorpwxUserid()+"$");
+                        }
+                    }
+//                    else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                        User tmpUser = companyUserMap.getOrDefault(map.get("value"),null);
+//                        if(null != tmpUser){
+//                            map.put("label","$username="+tmpUser.getDingdingUserid()+"$");
+//                        }
+//                    }
+                }
                 msg.data = realUser;
                 return msg;
             }else {
@@ -1971,6 +2025,20 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
 //            List<User> userList = userMapper.selectList(wrapper);
             List<Map<String, Object>> userList=userMapper.getSimpleActiveUserList(hashMap);
+            for (Map<String, Object> map : userList) {
+                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                    User tmpUser = companyUserMap.getOrDefault(map.get("value"),null);
+                    if(null != tmpUser){
+                        map.put("label","$username="+tmpUser.getCorpwxUserid()+"$");
+                    }
+                }
+//                else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+//                    User tmpUser = companyUserMap.getOrDefault(map.get("value"),null);
+//                    if(null != tmpUser){
+//                        map.put("label","$username="+tmpUser.getDingdingUserid()+"$");
+//                    }
+//                }
+            }
             msg.data = userList;
             return msg;
         }

+ 7 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SysDictMapper.xml

@@ -15,5 +15,12 @@
     <sql id="Base_Column_List">
         id, code, name, seq, company_id
     </sql>
+    <insert id="batchInsertDict">
+        insert into sys_dict(code, name, seq, company_id, ext1, ext2, ext3)
+        values
+            <foreach collection="dicts" separator="," item="dict">
+                (#{dict.code},#{dict.name},#{dict.seq},#{dict.companyId},#{dict.ext1},#{dict.ext2},#{dict.ext3})
+            </foreach>
+    </insert>
 
 </mapper>