浏览代码

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

seyason 1 月之前
父节点
当前提交
8d8ab85429
共有 23 个文件被更改,包括 519 次插入25 次删除
  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-option label="线索" value="clue" />
           <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="order" />
+          <el-option label="销售订单" value="sales_order" />
           <el-option label="产品" value="product" />
         </el-select>
       </div>
@@ -265,7 +265,7 @@ const exportToWord = async (content: string) => {
 };
 
 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 {
   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" },
     ],
   },
+  {
+    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",
     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> {
-  return await post('report/getCustomerTotalCount', payload);
+  return await post('/report/getCustomerTotalCount', payload);
 }
 
 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> {

+ 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");
                 informationArrayList.add(information);
                 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);

+ 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){
             List<AIQuestionDetail> aiQuestionDetails = aiQuestionDetailMapper.selectList(new LambdaQueryWrapper<AIQuestionDetail>()
                     .select(AIQuestionDetail::getQuestionId, AIQuestionDetail::getSeq
-                            , AIQuestionDetail::getType, AIQuestionDetail::getContent)
+                            , AIQuestionDetail::getType, AIQuestionDetail::getContent, AIQuestionDetail::getCreateTime)
                     .eq(AIQuestionDetail::getQuestionId, aiQuestion.getQuestionId())
                     .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()
                 .toUser(toOpenId)//要推送的用户openid
                 .templateId(TEMPLATE_REPORT_FILL)//模版id
-                .url("http://mob.ttkuaiban.com/")//点击模版消息要访问的网址
+                .url("https://mobcrm.ttkuaiban.com/")//点击模版消息要访问的网址
                 .build();
         //3,如果是正式版发送模版消息,这里需要配置你的信息
         //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/
 # 智能客户管家公众号参数
 wx:
-  template_report_fill: lhwkaW9BKwCvMtCuoAxLw4lZoGgMaucL0Ap0Vz-5KOY
+  template_report_fill: tty9TkCAAADWNCMiTzLogJoWVSMsJ6XQ
   app_id: wx1c1d8fc81bc073a8
   app_secret: 17ad07f90ee845f99f4c1605647ef755
   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 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 plate9,
                                    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,
                 projectBaseCostData,projectKeyNodesData,
                  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
-        ,deptIds);
+        ,deptIds,leaderIds);
     }
 
     @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)
     private List<ProjectDeptInfo> departmentList;
 
+    @TableField(exist = false)
+    private List<ProjectLeader> leaderList;
+
 
     @Override
     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 plate9,
                             String plate10,
-                            String deptIds);
+                            String deptIds,
+                            String[] leaderIds);
 
     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
     private ProjectDeptRelateMapper projectDeptRelateMapper;
 
+    @Resource
+    private ProjectLeaderService projectLeaderService;
+
     @Value(value = "${upload.path}")
     private String path;
     @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<ProjectLevel> projectLevelList = projectLevelMapper.selectList(new QueryWrapper<ProjectLevel>().eq("company_id", companyId));
             TimeType timeType = timeTypeMapper.selectById(companyId);
+            List<ProjectLeader> leaderList = projectLeaderService.list(new QueryWrapper<ProjectLeader>().eq("company_id", companyId));
+
             List<Integer> projectIds = new ArrayList<>();
             for (Project p : projectList) {
                 projectIds.add(p.getId());
@@ -1578,7 +1583,18 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(first1.isPresent()){
                         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) {
                     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 plate9,
                                    String plate10,
-                                   String deptIds) {
+                                   String deptIds,
+                                   String[] leaderIds) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
@@ -1839,6 +1856,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     if(companyId==936){
                         projectSeparate.setId(id);
                         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.setProjectName(project.getProjectName());
@@ -1874,7 +1901,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     getParentFolders(list,proDocumentTemDetailList,project,user);
                 }
             }
-        } else {
+        }
+        else {
             oldProject = projectMapper.selectById(id);
             isNew = false;
             //修改项目
@@ -2108,6 +2136,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             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.setModuleName("项目管理");

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

@@ -15,7 +15,7 @@ spring:
       location: C:/upload/
   datasource:
     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
     password: P011430@Huoshi*
 #    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>
                     <span class="workName">{{detailName}}</span>
                 </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>
                 </el-form-item>
             </el-form>
@@ -194,13 +194,9 @@
                         formatter: function (params,ticket,callback) {
                             var res
                             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>" : '') + 
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                             } 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>" : '') + 
                                 ((_this.permissions.countHours) ? _this.$t('screening.workTime') + ":" + params[0].data.cost + _this.$t('time.hour') + "</br>" : '')
                             }