Browse Source

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper into master

seyason 1 month ago
parent
commit
8d8ab85429
23 changed files with 519 additions and 25 deletions
  1. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/build.bat
  2. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/components/AIChat.vue
  3. 76 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/api.ts
  4. 202 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/index.vue
  5. 26 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/list.ts
  6. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/api.ts
  7. 6 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  8. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/AIQuestionServiceImpl.java
  9. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml
  11. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java
  12. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  13. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectLeaderController.java
  14. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  15. 57 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectLeader.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectLeaderMapper.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectLeaderService.java
  18. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java
  19. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectLeaderServiceImpl.java
  20. 41 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  21. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  22. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectLeaderMapper.xml
  23. 1 5
      fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/build.bat

@@ -1 +1 @@
-npm run build
+npm run buildNoTs

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/analysis/components/AIChat.vue

@@ -54,10 +54,10 @@
         <el-select v-model="systemTable" size="small" style="width: 120px">
         <el-select v-model="systemTable" size="small" style="width: 120px">
           <el-option label="线索" value="clue" />
           <el-option label="线索" value="clue" />
           <el-option label="商机" value="business_opportunity" />
           <el-option label="商机" value="business_opportunity" />
-          <el-option label="客户" value="customer" />
-          <el-option label="联系人" value="contact" />
+          <el-option label="客户" value="custom" />
+          <el-option label="联系人" value="contacts" />
           <el-option label="合同" value="contract" />
           <el-option label="合同" value="contract" />
-          <el-option label="销售订单" value="order" />
+          <el-option label="销售订单" value="sales_order" />
           <el-option label="产品" value="product" />
           <el-option label="产品" value="product" />
         </el-select>
         </el-select>
       </div>
       </div>
@@ -265,7 +265,7 @@ const exportToWord = async (content: string) => {
 };
 };
 
 
 type DataSourceType = 'system' | 'custom' | 'upload' | 'free';
 type DataSourceType = 'system' | 'custom' | 'upload' | 'free';
-type SystemTableType = 'clue' | 'business_opportunity' | 'customer' | 'contact' | 'contract' | 'order' | 'product';
+type SystemTableType = 'clue' | 'business_opportunity' | 'custom' | 'contacts' | 'contract' | 'sales_order' | 'product';
 
 
 interface ChatMessage {
 interface ChatMessage {
   role: 'user' | 'assistant';
   role: 'user' | 'assistant';

+ 76 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/api.ts

@@ -0,0 +1,76 @@
+import { post, get } from '@/utils/request';
+import { dayjs } from 'element-plus';
+
+export type RequestProps = {
+  startDate?: string;
+  endDate?: string;
+  exportType?: 0 | 1;
+  userId?: number;
+  departmentId?: number;
+};
+
+export async function getOverallData(payload?: RequestProps): Promise<any> {
+  return await post('/report/getCustomerTotalCount', payload);
+}
+
+export async function getConversionData(payload?: RequestProps): Promise<any> {
+  return await post('/report/getCustomerTransferRate', payload);
+}
+
+export async function getDepartmentData(): Promise<any> {
+  return await get('/department/normalList');
+}
+
+export async function getStaffData(): Promise<any> {
+  return await get('/user/getSimpleActiveUserList');
+}
+
+export async function exportFile(payload: RequestProps, type: number): Promise<any> {
+  return await post(
+    type === 0 ? '/report/exportCustomerTotalCount' : '/report/exportCustomerTransferRate',
+    payload
+  );
+}
+
+export const dateCollections = [
+  {
+    name: '当日',
+    start_time: dayjs().startOf('date').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().endOf('date').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '昨日',
+    start_time: dayjs().startOf('date').subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().endOf('date').subtract(1, 'day').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '本周',
+    start_time: dayjs().startOf('week').add(1, 'day').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().endOf('week').add(1, 'day').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '上周',
+    start_time: dayjs().add(-1, 'week').startOf('week').add(1, 'day').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().add(-1, 'week').endOf('week').add(1, 'day').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '本月',
+    start_time: dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '上月',
+    start_time: dayjs().add(-1, 'month').startOf('month').format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().add(-1, 'month').endOf('month').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '本季度',
+    start_time: dayjs().month(0).format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().month(2).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+  },
+  {
+    name: '上季度',
+    start_time: dayjs().add(-1, 'year').month(9).format('YYYY-MM-DD HH:mm:ss'),
+    end_time: dayjs().add(-1, 'year').month(11).endOf('month').format('YYYY-MM-DD HH:mm:ss')
+  }
+];

+ 202 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/cusTotalAnalysis/index.vue

@@ -0,0 +1,202 @@
+<script lang="ts" setup>
+import { ref, onMounted, watch, reactive } from "vue";
+import {
+  type RequestProps,
+  getOverallData,
+  exportFile,
+  dateCollections
+} from './api';
+import { downloadFile } from '@/utils/tools';
+import { dealWithTranslation } from '@/utils/translationProcessing';
+import personnelSearch from '@/components/translationComponent/personnelSearch/personnelSearch.vue';
+import treeSelect from '@/components/translationComponent/treeSelect/treeSelect.vue';
+import Echarts from '@/components/ReEcharts/index.vue';
+import { EChartsOption } from 'echarts';
+import { useStore } from '@/store/index';
+import { storeToRefs } from 'pinia';
+
+const { userInfo } = storeToRefs(useStore());
+const isLoading = ref(false);
+const dataSource = ref([]);
+const form = reactive({ type: 1, date: undefined, member: '' });
+const chartOptions: EChartsOption = reactive({
+  grid: { bottom: 30 },
+  legend: {},
+  tooltip: {},
+  toolbox: {
+    show: true,
+    feature: {
+      magicType: {
+        show: true,
+        type: ['line', 'bar'] // 允许切换的图表类型
+      },
+      restore: { show: true } // 还原按钮
+    }
+  },
+  dataset: {
+    dimensions: [],
+    source: []
+  },
+  xAxis: { type: 'category' },
+  yAxis: {},
+  series: []
+});
+
+const dateOptions = [
+  { label: '今天', value: '1' },
+  { label: '昨天', value: '2' },
+  { label: '本周', value: '3' },
+  { label: '上周', value: '4' },
+  { label: '本月', value: '5' },
+  { label: '上月', value: '6' },
+  { label: '本季度', value: '7' },
+  { label: '上季度', value: '8' }
+];
+const exportLoading = ref(false);
+const seachLoading = ref(false);
+
+const onSubmit = async (isExport?: boolean) => {
+  const payload = {
+    startDate: form.date && dateCollections[form.date - 1].start_time,
+    endDate: form.date && dateCollections[form.date - 1].end_time,
+    exportType: form.type,
+    userId: form.type === 1 ? form.member : undefined,
+    departmentId: form.type === 1 ? undefined : form.member
+  } as RequestProps;
+
+  if (isExport) {
+    exportLoading.value = true;
+    const { data } = await exportFile(payload, 0);
+    await downloadFile(data, data?.split('/')?.[2] || '客户表');
+    exportLoading.value = false;
+    return;
+  }
+  queryOverall(payload);
+};
+
+const queryOverall = async (payload?: RequestProps) => {
+  isLoading.value = true;
+  seachLoading.value = true
+  const { data = [] } = await getOverallData(payload);
+  isLoading.value = false;
+  dataSource.value = data.map((d: any) => ({
+    dealRate: d.dealRate * 100,
+    customerDeal: d.customerDeal,
+    customertotal: d.customertotal,
+    name: form.type === 1 ? d.name : d.departmentName
+  }));
+  seachLoading.value = false
+
+  const sourceData = data.map((d: any) => {
+    const base = {
+      name: form.type === 1 ? d.name : d.departmentName,
+      ['成交客户数']: d.customerDeal,
+      ['新增客户数']: d.customertotal
+    };
+    
+    if (form.type === 0) {
+      base['客户总数'] = d.earlierCusTotal;
+    }
+
+    return base;
+  });
+
+  const sourceDataTypes = sourceData.map((item: any) => ({
+    type: form.type === 1 ? 'userName' : 'departmentName',
+    id: item.name
+  }));
+
+  chartOptions.series = [
+    { type: 'bar', barWidth: 40, color: '#ffba6d' },
+    { type: 'bar', barWidth: 40, color: '#3f95c2' }
+  ];
+
+  if (form.type === 0) {
+    chartOptions.series.push({ type: 'bar', barWidth: 40, color: '#6dc8e1' }); // 只有按部门时才显示客户总数的柱状图
+  }
+
+  if (userInfo && userInfo.value.userNameNeedTranslate == 1) {
+    dealWithTranslation(sourceDataTypes, sourceData).then((res: any) => {
+      chartOptions.dataset.dimensions = ['name', '成交客户数', '新增客户数'];
+      if (form.type === 0) {
+        chartOptions.dataset.dimensions.push('客户总数'); // 只有按部门时才加入
+      }
+      chartOptions.dataset.source = res;
+      chartOptions.legend = {};
+    });
+    return;
+  }
+
+  chartOptions.dataset.dimensions = ['name', '成交客户数', '新增客户数'];
+  if (form.type === 0) {
+    chartOptions.dataset.dimensions.push('客户总数');
+  }
+  chartOptions.dataset.source = sourceData;
+  chartOptions.legend = {};
+};
+
+onMounted(() => {
+  onSubmit(false);
+});
+</script>
+
+
+<template>
+  <div class="w-full h-full p-5 bg-white flex flex-col">
+    <div class="flex justify-between">
+      <div class="flex items-center">
+        <div class="flex items-center mr-8">
+          <div class="mr-3 text-[14px]">时间</div>
+          <el-select clearable v-model="form.date" style="width: 112px">
+            <el-option v-for="date in dateOptions" :key="date.value" :label="date.label" :value="date.value" />
+          </el-select>
+        </div>
+
+        <div class="flex items-center mr-8">
+          <div class="mr-3 text-[14px]">分类</div>
+          <el-select v-model="form.type" @change="form.member = ''" style="width: 112px">
+            <el-option label="按部门" :value="0" />
+            <el-option label="按员工" :value="1" />
+          </el-select>
+        </div>
+
+        <div class="flex items-center mr-8">
+          <div class="mr-3 text-[14px]">{{ form.type == 1 ? '员工' : '部门' }}</div>
+          <template v-if="form.type == 1">
+            <personnel-search v-model="form.member" :size="''" placeholder="选择员工" width="240px"></personnel-search>
+          </template>
+          <template v-if="form.type == 0">
+            <tree-select v-model="form.member" :size="''" checkStrictly placeholder="选择部门" width="240px"></tree-select>
+          </template>
+        </div>
+
+        <div class="flex items-center mr-8">
+          <el-button type="primary" @click="onSubmit(false)" :loading="seachLoading">搜索</el-button>
+        </div>
+      </div>
+      <el-button type="primary" @click="onSubmit(true)" :loading="exportLoading">导出</el-button>
+    </div>
+    <div class="flex-1 py-4">
+      <Echarts :option="chartOptions"></Echarts>
+    </div>
+    <div class="h-[40vh]">
+      <el-table :data="dataSource" style="height: 100%" v-loading="seachLoading">
+        <el-table-column prop="name" label="名称" align="center">
+          <template #default="scope">
+            <TextTranslation translationTypes="userName" :translationValue="scope.row.name"></TextTranslation>
+          </template>
+        </el-table-column>
+        <el-table-column prop="customertotal" label="新增客户数" align="center" />
+        <el-table-column prop="customerDeal" label="成交客户数" align="center" />
+        <el-table-column prop="dealRate" label="客户成交率(%)" align="center" >
+          <template #default="scope">
+            {{ scope.row?.dealRate.toFixed(0) }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+</style>

+ 26 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/biReport/list.ts

@@ -961,6 +961,32 @@ export const dropdownBoxFieldIntegration = [
       { label: "是", value: "1" },
       { label: "是", value: "1" },
     ],
     ],
   },
   },
+  {
+    indicate: "task",
+    fieldName: "pay_type",
+    list: [
+      { label: "未付款", value: "0" },
+      { label: "付款", value: "1" },
+    ],
+  },
+  {
+    indicate: "task",
+    fieldName: "pay_way",
+    list: [
+      { label: "Paynow", value: "0" },
+      { label: "Cash", value: "1" },
+      { label: "Wechat", value: "2" },
+    ],
+  },
+  {
+    indicate: "task",
+    fieldName: "custom_type",
+    list: [
+      { label: "居民住家", value: "0" },
+      { label: "商业区", value: "1" },
+      { label: "其他类型", value: "2" },
+    ],
+  },
   {
   {
     indicate: "task_comment",
     indicate: "task_comment",
     fieldName: "type",
     fieldName: "type",

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/api.ts

@@ -10,11 +10,11 @@ export type RequestProps = {
 };
 };
 
 
 export async function getOverallData(payload?: RequestProps): Promise<any> {
 export async function getOverallData(payload?: RequestProps): Promise<any> {
-  return await post('report/getCustomerTotalCount', payload);
+  return await post('/report/getCustomerTotalCount', payload);
 }
 }
 
 
 export async function getConversionData(payload?: RequestProps): Promise<any> {
 export async function getConversionData(payload?: RequestProps): Promise<any> {
-  return await post('report/getCustomerTransferRate', payload);
+  return await post('/report/getCustomerTransferRate', payload);
 }
 }
 
 
 export async function getDepartmentData(): Promise<any> {
 export async function getDepartmentData(): Promise<any> {

+ 6 - 4
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java

@@ -374,10 +374,12 @@ public class TaskController {
                         .setTime(new Date()).setChecked(0).setPath("/tasks");
                         .setTime(new Date()).setChecked(0).setPath("/tasks");
                 informationArrayList.add(information);
                 informationArrayList.add(information);
                 User user = userMapper.selectById(userId);
                 User user = userMapper.selectById(userId);
-                WxCorpInfo corpinfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
-                if (corpinfo!=null&&corpinfo.getSaasSyncContact()==1) {
-                    wxCorpInfoService.sendWXCorpMsg(corpinfo, user.getCorpwxUserid(), msg, null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
-                    log.info("给{}发送信息:{}",user.getCorpwxUserid(),msg);
+                if (user!=null) {
+                    WxCorpInfo corpinfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+                    if (corpinfo != null && corpinfo.getSaasSyncContact() == 1) {
+                        wxCorpInfoService.sendWXCorpMsg(corpinfo, user.getCorpwxUserid(), msg, null, WxCorpInfoServiceImpl.TEXT_CARD_MSG_TASK);
+                        log.info("给{}发送信息:{}", user.getCorpwxUserid(), msg);
+                    }
                 }
                 }
             }
             }
             informationService.saveBatch(informationArrayList);
             informationService.saveBatch(informationArrayList);

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

@@ -501,7 +501,7 @@ public class AIQuestionServiceImpl extends ServiceImpl<AIQuestionMapper, AIQuest
         if(null != aiQuestion){
         if(null != aiQuestion){
             List<AIQuestionDetail> aiQuestionDetails = aiQuestionDetailMapper.selectList(new LambdaQueryWrapper<AIQuestionDetail>()
             List<AIQuestionDetail> aiQuestionDetails = aiQuestionDetailMapper.selectList(new LambdaQueryWrapper<AIQuestionDetail>()
                     .select(AIQuestionDetail::getQuestionId, AIQuestionDetail::getSeq
                     .select(AIQuestionDetail::getQuestionId, AIQuestionDetail::getSeq
-                            , AIQuestionDetail::getType, AIQuestionDetail::getContent)
+                            , AIQuestionDetail::getType, AIQuestionDetail::getContent, AIQuestionDetail::getCreateTime)
                     .eq(AIQuestionDetail::getQuestionId, aiQuestion.getQuestionId())
                     .eq(AIQuestionDetail::getQuestionId, aiQuestion.getQuestionId())
                     .orderByAsc(AIQuestionDetail::getSeq)
                     .orderByAsc(AIQuestionDetail::getSeq)
             );
             );

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/task/TimingTask.java

@@ -169,7 +169,7 @@ public class TimingTask {
         WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
         WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                 .toUser(toOpenId)//要推送的用户openid
                 .toUser(toOpenId)//要推送的用户openid
                 .templateId(TEMPLATE_REPORT_FILL)//模版id
                 .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mob.ttkuaiban.com/")//点击模版消息要访问的网址
+                .url("https://mobcrm.ttkuaiban.com/")//点击模版消息要访问的网址
                 .build();
                 .build();
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         //templateMessage.addData(new WxMpTemplateData("first", "您今天的工时填报还未完成", "#FF00FF"));
         //templateMessage.addData(new WxMpTemplateData("first", "您今天的工时填报还未完成", "#FF00FF"));

+ 1 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/application.yml

@@ -108,7 +108,7 @@ picrecongnize:
   design: C:/picrecongnize/design/
   design: C:/picrecongnize/design/
 # 智能客户管家公众号参数
 # 智能客户管家公众号参数
 wx:
 wx:
-  template_report_fill: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
+  template_report_fill: tty9TkCAAADWNCMiTzLogJoWVSMsJ6XQ
   app_id: wx1c1d8fc81bc073a8
   app_id: wx1c1d8fc81bc073a8
   app_secret: 17ad07f90ee845f99f4c1605647ef755
   app_secret: 17ad07f90ee845f99f4c1605647ef755
   template_report_pass: dbMuR2v7lxXLwRaorIWQ4T6ilvn0vzqmDDkD_3ZsaXc
   template_report_pass: dbMuR2v7lxXLwRaorIWQ4T6ilvn0vzqmDDkD_3ZsaXc

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/constant/Constant.java

@@ -60,4 +60,5 @@ public class Constant {
     public static final String[] LEAVE_CHECK= {"审核结果","审核人","请假时间","备注"};
     public static final String[] LEAVE_CHECK= {"审核结果","审核人","请假时间","备注"};
     
     
     public static final int ZHE_ZHONG_COMPANY_ID=4811;
     public static final int ZHE_ZHONG_COMPANY_ID=4811;
+    public static final int MLD_COMPANY_ID=876;
 }
 }

+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -211,12 +211,13 @@ public class ProjectController {
                                    String plate8,
                                    String plate8,
                                    String plate9,
                                    String plate9,
                                    String plate10,
                                    String plate10,
-                                   @RequestParam(required = false,value = "deptIds") String deptIds) {
+                                   @RequestParam(required = false,value = "deptIds") String deptIds,
+                                   String[] leaderIds) {
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,changeContractReason,
         return projectService.editProject(id, name, code, userId, inchargerId, isPublic, planStartDate, planEndDate, level, contractAmount,changeContractReason,
                 projectBaseCostData,projectKeyNodesData,
                 projectBaseCostData,projectKeyNodesData,
                  budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames,
                  budget,customerId,chosenLeaders, associateDegrees, associateDegreeNames,
                 taskGpIncharge,auditUserIds, ccUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay,manDayStartDate,reviwerId, plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10
                 taskGpIncharge,auditUserIds, ccUserIds, category, projectDesc,projectMainId, providerIds, providerNames, request,projectSeparate,outputValue,deptId,onlyChangeParticipate,buId,manDay,manDayStartDate,reviwerId, plate1,plate2,plate3,plate4,plate5,plate6,plate7,plate8,plate9,plate10
-        ,deptIds);
+        ,deptIds,leaderIds);
     }
     }
 
 
     @RequestMapping("/adjustBase")
     @RequestMapping("/adjustBase")

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectLeaderController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-04-02
+ */
+@RestController
+@RequestMapping("/project-leader")
+public class ProjectLeaderController {
+
+}
+

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -491,6 +491,9 @@ public class Project extends Model<Project> {
     @TableField(exist = false)
     @TableField(exist = false)
     private List<ProjectDeptInfo> departmentList;
     private List<ProjectDeptInfo> departmentList;
 
 
+    @TableField(exist = false)
+    private List<ProjectLeader> leaderList;
+
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

+ 57 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectLeader.java

@@ -0,0 +1,57 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-04-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectLeader extends Model<ProjectLeader> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
+    /**
+     * 小组长id
+     */
+    @TableField("leader_id")
+    private String leaderId;
+
+    /**
+     * 公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField(exist = false)
+    private String userName;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectLeaderMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.ProjectLeader;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-04-02
+ */
+public interface ProjectLeaderMapper extends BaseMapper<ProjectLeader> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectLeaderService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.ProjectLeader;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-04-02
+ */
+public interface ProjectLeaderService extends IService<ProjectLeader> {
+
+}

+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -61,7 +61,8 @@ public interface ProjectService extends IService<Project> {
                             String plate8,
                             String plate8,
                             String plate9,
                             String plate9,
                             String plate10,
                             String plate10,
-                            String deptIds);
+                            String deptIds,
+                            String[] leaderIds);
 
 
     HttpRespMsg deleteProject(Integer id, Integer force);
     HttpRespMsg deleteProject(Integer id, Integer force);
 
 

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectLeaderServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectLeader;
+import com.management.platform.mapper.ProjectLeaderMapper;
+import com.management.platform.service.ProjectLeaderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2025-04-02
+ */
+@Service
+public class ProjectLeaderServiceImpl extends ServiceImpl<ProjectLeaderMapper, ProjectLeader> implements ProjectLeaderService {
+
+}

+ 41 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -259,6 +259,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     @Resource
     @Resource
     private ProjectDeptRelateMapper projectDeptRelateMapper;
     private ProjectDeptRelateMapper projectDeptRelateMapper;
 
 
+    @Resource
+    private ProjectLeaderService projectLeaderService;
+
     @Value(value = "${upload.path}")
     @Value(value = "${upload.path}")
     private String path;
     private String path;
     @Value("${configEnv.isDev}")
     @Value("${configEnv.isDev}")
@@ -1430,6 +1433,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", companyId));
             List<ProjectMain> projectMainList = projectMainMapper.selectList(new QueryWrapper<ProjectMain>().eq("company_id", companyId));
             List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
             List<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
             TimeType timeType = timeTypeMapper.selectById(companyId);
+            List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>().eq("company_id", companyId));
+
             List<Integer> projectIds = new ArrayList<>();
             List<Integer> projectIds = new ArrayList<>();
             for (Project p : projectList) {
             for (Project p : projectList) {
                 projectIds.add(p.getId());
                 projectIds.add(p.getId());
@@ -1578,7 +1583,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(first1.isPresent()){
                     if(first1.isPresent()){
                         projectVO.setProjectSeparate(first1.get());
                         projectVO.setProjectSeparate(first1.get());
                     }
                     }
+                }else if (companyId==Constant.MLD_COMPANY_ID){
+                    List<ProjectLeader> leaderCollect = leaderList.stream().filter(l -> l.getProjectId().equals(project.getId())).collect(Collectors.toList());
+                    leaderCollect.forEach(l->{
+                        Optional<User> userOptional = userList.stream().filter(u -> u.getId().equals(l.getLeaderId())).findFirst();
+                        if(userOptional.isPresent()){
+                            User user1 = userOptional.get();
+                            l.setUserName(user1.getName());
+                        }
+                    });
+                    projectVO.setLeaderList(leaderCollect);
                 }
                 }
+
                 //工程专业版:计算当前项目的总进度
                 //工程专业版:计算当前项目的总进度
                 if (company.getPackageEngineering() == 1) {
                 if (company.getPackageEngineering() == 1) {
                     List<PpMembs> curProjectPMList = ppMembList.stream().filter(pp->pp.getProjectId().equals(project.getId())).collect(Collectors.toList());
                     List<PpMembs> curProjectPMList = ppMembList.stream().filter(pp->pp.getProjectId().equals(project.getId())).collect(Collectors.toList());
@@ -1697,7 +1713,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                    String plate8,
                                    String plate8,
                                    String plate9,
                                    String plate9,
                                    String plate10,
                                    String plate10,
-                                   String deptIds) {
+                                   String deptIds,
+                                   String[] leaderIds) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
         Integer companyId = user.getCompanyId();
@@ -1839,6 +1856,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(companyId==936){
                     if(companyId==936){
                         projectSeparate.setId(id);
                         projectSeparate.setId(id);
                         projectSeparateMapper.insert(projectSeparate);
                         projectSeparateMapper.insert(projectSeparate);
+                    }else if (companyId==Constant.MLD_COMPANY_ID){
+                        ArrayList<ProjectLeader> leaderArrayList = new ArrayList<>();
+                        for (String leaderId : leaderIds) {
+                            ProjectLeader leader = new ProjectLeader();
+                            leader.setProjectId(project.getId());
+                            leader.setLeaderId(leaderId);
+                            leader.setCompanyId(companyId);
+                            leaderArrayList.add(leader);
+                        }
+                        projectLeaderService.saveBatch(leaderArrayList);
                     }
                     }
                     OperationRecord operationRecord=new OperationRecord();
                     OperationRecord operationRecord=new OperationRecord();
                     operationRecord.setProjectName(project.getProjectName());
                     operationRecord.setProjectName(project.getProjectName());
@@ -1874,7 +1901,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     getParentFolders(list,proDocumentTemDetailList,project,user);
                     getParentFolders(list,proDocumentTemDetailList,project,user);
                 }
                 }
             }
             }
-        } else {
+        }
+        else {
             oldProject = projectMapper.selectById(id);
             oldProject = projectMapper.selectById(id);
             isNew = false;
             isNew = false;
             //修改项目
             //修改项目
@@ -2108,6 +2136,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             content+="\n"+s;
                             content+="\n"+s;
                         }
                         }
                     }
                     }
+                }else if (companyId==Constant.MLD_COMPANY_ID){
+                    projectLeaderService.remove(new QueryWrapper<ProjectLeader>().eq("project_id",p.getId()));
+                    ArrayList<ProjectLeader> leaderArrayList = new ArrayList<>();
+                    for (String leaderId : leaderIds) {
+                        ProjectLeader leader = new ProjectLeader();
+                        leader.setProjectId(p.getId());
+                        leader.setLeaderId(leaderId);
+                        leader.setCompanyId(companyId);
+                        leaderArrayList.add(leader);
+                    }
+                    projectLeaderService.saveBatch(leaderArrayList);
                 }
                 }
                 operationRecord.setContent(content);
                 operationRecord.setContent(content);
                 //operationRecord.setModuleName("项目管理");
                 //operationRecord.setModuleName("项目管理");

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
       location: C:/upload/
   datasource:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     driver-class-name: com.mysql.cj.jdbc.Driver
-    url: jdbc:mysql://1.94.62.58:17089/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
+    url: jdbc:mysql://1.94.62.58:17089/man_mld?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useSSL=false
     username: root
     username: root
     password: P011430@Huoshi*
     password: P011430@Huoshi*
 #    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
 #    url: jdbc:mysql://47.100.37.243:7644/man_hour_manager?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectLeaderMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.ProjectLeaderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectLeader">
+        <id column="id" property="id" />
+        <result column="project_id" property="projectId" />
+        <result column="leader_id" property="leaderId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, project_id, leader_id
+    </sql>
+
+</mapper>

+ 1 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/project/detail.vue

@@ -10,7 +10,7 @@
                 <el-form-item>
                 <el-form-item>
                     <span class="workName">{{detailName}}</span>
                     <span class="workName">{{detailName}}</span>
                 </el-form-item>
                 </el-form-item>
-                <el-form-item style="float:right;">
+                <el-form-item style="float:right;" v-if="permissions.countCost">
                     <span style="font-size:18px;">{{ $t('xiang-mu-cheng-ben') }}:<span class="themeFontColor">{{cost.toFixed(2)}}{{ $t('yuan') }}</span></span>
                     <span style="font-size:18px;">{{ $t('xiang-mu-cheng-ben') }}:<span class="themeFontColor">{{cost.toFixed(2)}}{{ $t('yuan') }}</span></span>
                 </el-form-item>
                 </el-form-item>
             </el-form>
             </el-form>
@@ -194,13 +194,9 @@
                         formatter: function (params,ticket,callback) {
                         formatter: function (params,ticket,callback) {
                             var res
                             var res
                             if(_this.user.userNameNeedTranslate == 1 && _this.radio == _this.$t('ren-yuan')) {
                             if(_this.user.userNameNeedTranslate == 1 && _this.radio == _this.$t('ren-yuan')) {
-                                // res = '' + "<br/>"+_this.$t('workcost')+" : " + params[0].data.money 
-                                // + _this.$t('yuan')+"<br/>"+_this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour');
                                 res = ((_this.permissions.countCost) ? _this.$t('workcost') + ":" + params[0].data.money + _this.$t('yuan') + "</br>" : '') + 
                                 res = ((_this.permissions.countCost) ? _this.$t('workcost') + ":" + params[0].data.money + _this.$t('yuan') + "</br>" : '') + 
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                             } else {
                             } else {
-                                // res = params[0].name + "<br/>"+_this.$t('workcost')+" : " + params[0].data.money 
-                                // + _this.$t('yuan')+"<br/>"+_this.$t('screening.workTime')+" : " + params[0].data.cost + _this.$t('time.hour');
                                 res = ((_this.permissions.countCost) ? _this.$t('workcost') + ":" + params[0].data.money + _this.$t('yuan') + "</br>" : '') + 
                                 res = ((_this.permissions.countCost) ? _this.$t('workcost') + ":" + params[0].data.money + _this.$t('yuan') + "</br>" : '') + 
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                             }
                             }