浏览代码

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

QuYueTing 4 月之前
父节点
当前提交
bd8d87cc47
共有 15 个文件被更改,包括 104 次插入34 次删除
  1. 20 2
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/pullDownSelector.vue
  2. 10 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue
  3. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue
  4. 3 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/tabbar/home/component/workbench.vue
  5. 2 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/visitorProgram/addEditorVisitor.vue
  6. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/defaultData.js
  7. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js
  8. 5 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/TaskController.java
  9. 6 6
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java
  10. 26 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  11. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java
  12. 3 0
      fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue
  13. 13 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java
  14. 3 1
      fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml
  15. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

+ 20 - 2
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/components/common/pullDownSelector.vue

@@ -68,6 +68,10 @@ const props = defineProps({
     type: Array,
     default: () => [],
   },
+  showElement: {
+    type: Boolean,
+    default: () => false,
+  },
   value: {
     type: [String, Array],
     default: () => [],
@@ -106,7 +110,21 @@ watch(() => props.options, (newValue) => {
 })
 
 watch(() => props.value, (newValue) => {
-  selectChecked.value = newValue
+  if(!newValue) {
+    selectChecked.value = []
+  }
+  selectChecked.value = Array.isArray(newValue) ? newValue : [newValue]
+})
+
+watch(() => props.showElement, (newValue) => {
+  if(!newValue) {
+    setTimeout(() => {
+      searchForValue.value = ''
+      searchOptions('')
+      const val = (props.value && Array.isArray(props.value) && props.value.length > 0)
+      selectChecked.value = val ? selectChecked.value : []
+    }, 500)
+  }
 })
 
 function searchOptions(val) {
@@ -120,7 +138,7 @@ function searchOptions(val) {
       return;
     }
     const list = manualCopying(allOptions.value);
-    renderingOptions.value = list.filter((item) => item.label.indexOf(val) > -1);
+    renderingOptions.value = list.filter((item) => (item.label || '').indexOf(val) > -1);
     return
   }
 

+ 10 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/moduleList/moduleList.vue

@@ -87,7 +87,7 @@
                           <div>
                             <div class="flex items-center flex-row">
                               <div class="flex-1 truncate mr-8 titles relative">{{ item.taskName }}</div>
-                              <div class="text-[#B9B9B9]">
+                              <div :style="`color: ${fixedFieldTaskStatus.find(subItem => subItem.value == item.status)?.color}`">
                                 {{ fixedFieldTaskStatus.find(subItem => subItem.value == item.status)?.label || '' }}
                               </div>
                             </div>
@@ -190,7 +190,12 @@
             </van-pull-refresh>
           </template>
           <template v-else>
-            <van-skeleton title :row="20" class="w-full h-full" />
+            <template v-if="!isLoading && listData?.records && !listData.records.length">
+              <van-empty description="暂无数据" />
+            </template>
+            <template v-else>
+              <van-skeleton title :row="20" class="w-full h-full" />
+            </template>
           </template>
         </div>
       </div>
@@ -215,7 +220,7 @@
 
       <!-- select 选择器 -->
       <van-popup v-model:show="showSelect" destroy-on-close position="bottom" :style="{ height: '80%' }">
-        <PullDownSelector @change="selectChange" />
+        <PullDownSelector :showElement="showSelect" @change="selectChange" />
       </van-popup>
     </template>
   </Page>
@@ -346,11 +351,12 @@ function claimAndClaim(item) {
 // 删除事件
 function deleteRow(row) {
   const { name = '', searchFiled = {}, deteleFiled = '' } = queryParameters.value
+  const foemVal = { [queryParameters.value.key == 'tasks' ? 'taskIds' : 'ids']: row.id }
   showConfirmDialog({
     title: `删除${name}`,
     message: `确定删除【${row[searchFiled?.search]}】${name}吗?`,
   }).then(() => {
-    requests.post(deteleFiled, { ids: row.id }).then((res) => {
+    requests.post(deteleFiled, { ...foemVal }).then((res) => {
       toastSuccess('删除成功')
       onRefresh(true)
     }).catch((err) => {

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/pages/pageComponents/tasks/addEditor.vue

@@ -129,7 +129,7 @@
                     <div class="flex items-center justify-end">
                       <van-stepper v-model="item.value" :min="0" button-size="1.2rem" theme="round" integer
                         class="mr-2" />
-                      
+                      
                       <van-icon name="delete-o" class="ml-2 text-[red]" size="1.3rem"
                         @click="deleteCustomeDateItem(index)" />
                     </div>
@@ -167,11 +167,11 @@
     <div>
       <!-- 下拉框选择 -->
       <van-popup v-model:show="showSelectionFlag" destroy-on-close position="bottom" :style="{ height: '80%' }">
-        <PullDownSelector :options="showSelectionArray" :doYouNeedTranslation="false" @change="selectChange" />
+        <PullDownSelector :show-element="showSelectionFlag" :options="showSelectionArray" :doYouNeedTranslation="false" @change="selectChange" />
       </van-popup>
 
       <van-popup v-model:show="showSelectionToFlag" destroy-on-close position="bottom" :style="{ height: '80%' }">
-        <PullDownSelector :value="showSelectionToValue" @change="selectChange" :multiple-choice="true" />
+        <PullDownSelector :show-element="showSelectionToFlag" :value="showSelectionToValue" @change="selectChange" :multiple-choice="true" />
       </van-popup>
 
       <!-- 选择日期 -->
@@ -440,7 +440,7 @@ function initializeData() {
     businessOpportunityIdName: businessOpportunityName,
     priorityName: fixedFieldPriority.find(item => item.value == priority)?.label || '',
     taskTypeName: fixedFieldTaskType.find(item => item.value == taskType)?.label || '',
-    repeatTypenName: fixedFieldRepetitiveType.find(item => item.value == repeatType)?.label || ''
+    repeatTypeName: fixedFieldRepetitiveType.find(item => item.value == repeatType)?.label || ''
   }
 
   const list = repeatDesignDay && repeatDesignDay.split(',') || []

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

@@ -316,7 +316,9 @@ function processForms() {
 }
 
 function getVisitorPlan() {
-  requests.post(GET_VISITOR_PLAN, { calenderDate: dateConditions.value }).then((res) => {
+  requests.post(GET_VISITOR_PLAN, { 
+    calenderDate: dayjs(dateConditions.value).format('YYYY-MM') 
+  }).then((res) => {
     visitorProgramList.value = res.data || []
   })
 }

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

@@ -157,6 +157,7 @@
         :style="{ height: '80%' }"
       >
         <PullDownSelector
+          :showElement="customerShowPicker"
           :options="customerAllList"
           :doYouNeedTranslation="false"
           @change="customerSelectChange"
@@ -169,7 +170,7 @@
         position="bottom"
         :style="{ height: '80%' }"
       >
-        <PullDownSelector @change="personnelSelectChange" />
+        <PullDownSelector :showElement="personnelShowPicker" @change="personnelSelectChange" />
       </van-popup>
       <!-- 拜访目的 -->
       <van-popup

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/defaultData.js

@@ -30,10 +30,10 @@ export const fixedFieldTaskType = [
 
 //任务状态
 export const fixedFieldTaskStatus = [
-  { label: "未开始", value: "0", type: "info" },
-  { label: "进行中", value: "1", type: "primary" },
-  { label: "已完成", value: "2", type: "success" },
-  { label: "已超时", value: "3", type: "danger" },
+  { label: "未开始", value: "0", type: "info", color: '#B9B9B9' },
+  { label: "进行中", value: "1", type: "primary", color: '#075985' },
+  { label: "已完成", value: "2", type: "success", color: '#07C160' },
+  { label: "已超时", value: "3", type: "danger", color: '#EE0A24' },
 ];
 
 // 合同状态

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm-h5/src/utility/generalVariables.js

@@ -28,7 +28,7 @@ export const routingInfos = {
     icon: 'icon-shangpin',
     // listUrl: GET_A_LIST_OF_CLUES,
     listUrl: TOP_DATA_OF_CLUE_LIST,
-    deteleUrl: DELETE_CLUES,
+    deteleFiled: DELETE_CLUES,
     transferInterface: TRANSFER_CLUES,
     addEditingInterface: NEW_CLUE_EDITING,
     topMountedInterface: TOP_OF_CLUES,

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

@@ -24,6 +24,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
@@ -180,7 +181,7 @@ public class TaskController {
                         saveInformationListWithCount(task, taskInformation, between, executorIdList);
                     }else if (task.getRepeatEndDate()!=null){
                         TaskInformation taskInformation = selectTaskInformation(task);
-                        if (LocalDateTime.now().isAfter(task.getRepeatEndDate())){
+                        if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                             continue;
                         }
                         int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
@@ -200,7 +201,7 @@ public class TaskController {
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }else if (task.getRepeatEndDate()!=null){
                             TaskInformation taskInformation = selectTaskInformation(task);
-                            if (LocalDateTime.now().isAfter(task.getRepeatEndDate())){
+                            if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
                             int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
@@ -224,7 +225,7 @@ public class TaskController {
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }else if (task.getRepeatEndDate()!=null){
                             TaskInformation taskInformation = selectTaskInformation(task);
-                            if (LocalDateTime.now().isAfter(task.getRepeatEndDate())){
+                            if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
                             int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());
@@ -249,7 +250,7 @@ public class TaskController {
                             saveInformationListWithCount(task, taskInformation, between, executorIdList);
                         }else if (task.getRepeatEndDate()!=null){
                             TaskInformation taskInformation = selectTaskInformation(task);
-                            if (LocalDateTime.now().isAfter(task.getRepeatEndDate())){
+                            if (LocalDate.now().isAfter(task.getRepeatEndDate())){
                                 continue;
                             }
                             int between = (int) ChronoUnit.DAYS.between(LocalDateTime.now(), task.getRepeatEndDate());

+ 6 - 6
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Task.java

@@ -135,10 +135,10 @@ public class Task extends Model<Task> {
     /**
      * 重复结束 在  ? 日期YYYY-MM-DD之后
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("repeat_end_date")
-    private LocalDateTime repeatEndDate;
+    private LocalDate repeatEndDate;
 
     /**
      * 自定义日期: 每 ? 天一次,保存为 x1,x2,x3,x4
@@ -197,10 +197,10 @@ public class Task extends Model<Task> {
     /**
      * 完成日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     @TableField("finish_date")
-    private LocalDateTime finishDate;
+    private LocalDate finishDate;
 
 
     /**

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

@@ -126,6 +126,9 @@ public class TaskController {
     @Autowired
     private TaskFilesMapper taskFilesMapper;
 
+    @Resource
+    private WxCorpInfoMapper wxCorpInfoMapper;
+
     @PostMapping("/getTaskChargePage")
     public HttpRespMsg getTaskChargePage(
             QueryTaskChargePage queryBO, HttpServletRequest request) {
@@ -1370,6 +1373,8 @@ public class TaskController {
         pids.add(-1);
         List<Project> projectList = projectService.list(new QueryWrapper<Project>().in("id", pids));
         TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
+        CompanyDingding dingding = companyDingdingService.getOne(new LambdaQueryWrapper<CompanyDingding>().eq(CompanyDingding::getCompanyId, user.getCompanyId()));
         if(1 == timeType.getTaskFileCharge()){
             List<String> userIds = new ArrayList<>();
             List<String> chargeOneIds = list.stream().filter(t-> org.apache.commons.lang3.StringUtils.isNotBlank(t.getChargeOneId()))
@@ -1379,14 +1384,14 @@ public class TaskController {
             userIds.addAll(chargeOneIds);
             userIds.addAll(chargeTwoIds);
 
-            Map<String, String> userIdNameMap = new HashMap<>();
+            Map<String, User> userIdMap = new HashMap<>();
             if(CollectionUtils.isNotEmpty(userIds)){
                 userIds = userIds.stream().distinct().collect(Collectors.toList());
                 List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
                                 .select(User::getId,User::getName)
                         .in(User::getId, userIds)
                 );
-                userIdNameMap = users.stream().collect(Collectors.toMap(User::getId, User::getName));
+                userIdMap = users.stream().collect(Collectors.toMap(User::getId, t->t));
             }
             Map<Integer, List<TaskFiles>> taskFilesMap = new HashMap<>();
             if(CollectionUtils.isNotEmpty(taskFilesList)){
@@ -1406,16 +1411,31 @@ public class TaskController {
                 } else if (0 == task.getFinalChargeStatus()) {
                     String name = "";
                     String statusText = "";
+                    String userWxId = "";
+                    String fileChargeStatusText = "";
                     int finalStatus = 1==task.getChargeStage()?task.getChargeOneStatus():task.getChargeTwoStatus();
                     String tmpUserId = 1==task.getChargeStage()?task.getChargeOneId():task.getChargeTwoId();
-                    name = userIdNameMap.getOrDefault(tmpUserId,"");
+                    User chargeUser = userIdMap.get(tmpUserId);
+                    if(null != chargeUser){
+                        if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                            userWxId = chargeUser.getCorpwxRealUserid();
+                        }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                            userWxId = chargeUser.getDingdingUserid();
+                        }
+                        name = chargeUser.getName();
+                    }
                     switch (finalStatus)
                     {
                         case 0:  statusText = "待审核"; task.setFileChargeStatus(0);break;
                         case 1:  statusText = "通过";break;
                         case 2:  statusText = "驳回"; task.setFileChargeStatus(2);break;
                     }
-                    task.setFinalChargeStatusText(statusText+"("+name+")");
+                    if(org.apache.commons.lang3.StringUtils.isBlank(userWxId)){
+                        fileChargeStatusText = statusText+"("+name+")";
+                    }else{
+                        fileChargeStatusText = statusText+"("+("$userName=" + userWxId + "$")+")";
+                    }
+                    task.setFinalChargeStatusText(fileChargeStatusText);
                 }
             }
         }
@@ -1552,6 +1572,7 @@ public class TaskController {
         titleList.add("优先级");
         titleList.add("任务名称");
         titleList.add("执行人");
+        titleList.add("文件审核状态");
         titleList.add("开始时间");
         titleList.add("截止时间");
         boolean anyMatch = projectList.stream().anyMatch(p -> p.getDeptId() != null && !StringUtils.isEmpty(p.getDeptId()));
@@ -1591,6 +1612,7 @@ public class TaskController {
                 }
             }).collect(Collectors.joining(","));
             item.add(executorString);
+            item.add(task.getFinalChargeStatusText());
             item.add(task.getStartDate()==null?"":df.format(task.getStartDate()));
             item.add(task.getEndDate()==null?"":df.format(task.getEndDate()));
             if(anyMatch){

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/PermissionServiceImpl.java

@@ -279,6 +279,9 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
         if(!user.getRoleName().equals("超级管理员")){
             functionQueryWrapper.and(funWrapper->funWrapper.in("id",functionIds));
         }
+        if(0 == timeType.getTaskFileCharge()){
+            functionQueryWrapper.ne("name","审核任务文件");
+        }
         functionQueryWrapper.orderByAsc("seq");
         List<SysFunction> functionList = sysFunctionMapper.selectList(functionQueryWrapper);
         //勾选上角色选中的功能

+ 3 - 0
fhKeeper/formulahousekeeper/octopus/src/views/customer/list.vue

@@ -261,6 +261,7 @@
                     <el-form-item><el-checkbox v-model="dialogData.userWithMultiDept">是否开启人员设置可填报部门</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.importReportAuditNormal">导入的日报正常审批</el-checkbox></el-form-item>
                     <el-form-item><el-checkbox v-model="dialogData.onlyShowPercent">工时报告页面,工时仅显示比例</el-checkbox></el-form-item>
+                    <el-form-item><el-checkbox v-model="dialogData.taskFileCharge">任务文件支持审核</el-checkbox></el-form-item>
                     
                 </el-form>
             </div>
@@ -488,6 +489,7 @@ import App from '../../App.vue';
                             this.$set(this.dialogData,'enableNewWeeklyfill',res.data.enableNewWeeklyfill ? true : false)
                             this.$set(this.dialogData,'hideSubproject',res.data.hideSubproject ? true : false)
                             this.$set(this.dialogData,'userWithMultiDept',res.data.userWithMultiDept ? true : false)
+                            this.$set(this.dialogData,'taskFileCharge',res.data.taskFileCharge ? true : false)
                         }else{
                             this.$message({
                                 message: res.msg,
@@ -832,6 +834,7 @@ import App from '../../App.vue';
                     enableNewWeeklyfill: this.dialogData.enableNewWeeklyfill ? 1 : 0,
                     hideSubproject:this.dialogData.hideSubproject ? 1: 0, 
                     userWithMultiDept:this.dialogData.userWithMultiDept ? 1: 0, 
+                    taskFileCharge:this.dialogData.taskFileCharge ? 1: 0, 
                 },res => {
                     if(res.code == 'ok'){
                         this.editDialogG = false

+ 13 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-09-28
+ * @since 2025-01-02
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -612,6 +612,18 @@ public class TimeType extends Model<TimeType> {
     @TableField("verify_card_overtime")
     private Integer verifyCardOvertime;
 
+    /**
+     * 驳回日报原因是否必填
+     */
+    @TableField("force_reject_reason")
+    private Integer forceRejectReason;
+
+    /**
+     * 任务文件审核 0不启用 1启用
+     */
+    @TableField("task_file_charge")
+    private Integer taskFileCharge;
+
 
     @Override
     protected Serializable pkVal() {

文件差异内容过多而无法显示
+ 3 - 1
fhKeeper/formulahousekeeper/ops-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/task/list.vue

@@ -422,7 +422,7 @@
             </div>
         </el-dialog>
         <el-dialog title="文件驳回" :visible.sync="viewFilesAndReviewThemRejectVisable" width="800px">
-            <el-input type="textarea" :rows="5" placeholder="请输入驳回原因" v-model.trim="viewFilesAndReviewThemRejectVal">
+            <el-input type="textarea" :rows="5" placeholder="请输入驳回原因" v-model.trim="viewFilesAndReviewThemRejectVal" :maxlength="50">
             </el-input>
             <div slot="footer" class="dialog-footer">
                 <el-button type="primary" size="small" @click="viewFilesAndReviewThemRejectCli(2)" :loading="viewFilesAndReviewThemRejectValLoading">确定</el-button>