Browse Source

合同管理相关修改

seyason 2 năm trước cách đây
mục cha
commit
28a8e464a6
22 tập tin đã thay đổi với 619 bổ sung260 xóa
  1. 37 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java
  2. 19 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ContractController.java
  3. 6 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java
  4. 0 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java
  5. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyDingding.java
  6. 27 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Contract.java
  7. 7 22
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  8. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java
  9. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ContractService.java
  10. 40 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  11. 4 21
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  12. 11 11
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  13. 91 20
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  14. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDingdingMapper.xml
  15. 14 11
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractMapper.xml
  16. 22 22
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  17. 1 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  18. 195 25
      fhKeeper/formulahousekeeper/timesheet/src/views/contract/index.vue
  19. 23 12
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  20. 22 37
      fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue
  21. 75 36
      fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue
  22. 13 1
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

+ 37 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/CompanyDingdingController.java

@@ -1,15 +1,19 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
 import com.management.platform.entity.CompanyDingding;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.CompanyDingdingMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
@@ -30,7 +34,40 @@ public class CompanyDingdingController {
     private CompanyDingdingService companyDingdingService;
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+
+    @RequestMapping("/getSyncContact")
+    public HttpRespMsg getSyncContact() {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        HttpRespMsg msg = new HttpRespMsg();
+        CompanyDingding dd = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+        msg.data = dd.getSyncContact();
+
+        return msg;
+    }
+
 
+    @RequestMapping("/setSyncContact")
+    public HttpRespMsg setSyncContact(Integer isSync) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        HttpRespMsg msg = new HttpRespMsg();
+        CompanyDingding dd = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+        if (dd != null) {
+            CompanyDingding companyDingding = new CompanyDingding();
+            companyDingding.setCorpid(dd.getCorpid());
+            companyDingding.setSyncContact(isSync);
+            companyDingdingMapper.updateById(companyDingding);
+        } else {
+            msg.setError("未找到公司钉钉配置");
+        }
+
+        return msg;
+    }
 
     @RequestMapping("/pushAlertMsg")
     public HttpRespMsg pushAlertMsg(String corpid, String userDingId) {

+ 19 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ContractController.java

@@ -3,7 +3,9 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.Contract;
+import com.management.platform.entity.Project;
 import com.management.platform.entity.User;
+import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ContractService;
 import com.management.platform.service.ContractTypeService;
@@ -35,6 +37,8 @@ public class ContractController {
     private ContractService contractService;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private ProjectMapper projectMapper;
 
     /**
      * 分页查询合同
@@ -64,16 +68,16 @@ public class ContractController {
      * 新增合同
      */
     @RequestMapping("/addContract")
-    public HttpRespMsg addContract (HttpServletRequest request,Contract contract){
-        return contractService.addContract(request,contract);
+    public HttpRespMsg addContract (HttpServletRequest request,Contract contract, String paymentListStr){
+        return contractService.addContract(request,contract, paymentListStr);
     }
 
     /**
      * 编辑合同
      */
     @RequestMapping("/editContract")
-    public HttpRespMsg editContract (HttpServletRequest request,Contract contract){
-        return contractService.editContract(request,contract);
+    public HttpRespMsg editContract (HttpServletRequest request,Contract contract, String paymentListStr){
+        return contractService.editContract(request,contract, paymentListStr);
     }
 
     /**
@@ -103,5 +107,16 @@ public class ContractController {
     public HttpRespMsg contractFile (HttpServletRequest request,Integer id){
         return contractService.contractFile(request,id);
     }
+
+    @RequestMapping("/getProjectList")
+    public HttpRespMsg getProjectList (HttpServletRequest request){
+        HttpRespMsg msg = new HttpRespMsg();
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, project_code, project_name, contract_amount").eq("company_id", user.getCompanyId()));
+        msg.data = projectList;
+        return msg;
+    }
+
+
 }
 

+ 6 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseTypeController.java

@@ -98,12 +98,12 @@ public class ExpenseTypeController {
         HttpRespMsg msg = new HttpRespMsg();
         ExpenseType expenseType = expenseTypeMapper.selectById(id);
         Integer companyId = userMapper.selectById(request.getHeader("TOKEN")).getCompanyId();
-        Integer cut = expenseItemMapper.selectCount(new QueryWrapper<ExpenseItem>().eq("expense_type", expenseType.getTypeName()));
-        if(cut>0){
-            //msg.setError("删除失败,已绑定费用报销数据");
-            msg.setError(MessageUtils.message("expense.deleteError"));
-            return msg;
-        }
+//        Integer cut = expenseItemMapper.selectCount(new QueryWrapper<ExpenseItem>().eq("expense_type", expenseType.getTypeName()));
+//        if(cut>0){
+//            //msg.setError("删除失败,已绑定费用报销数据");
+//            msg.setError(MessageUtils.message("expense.deleteError"));
+//            return msg;
+//        }
         if (!expenseType.getCompanyId().equals(companyId)) {
             //msg.setError("无权操作");
             msg.setError(MessageUtils.message("access.operationError"));

+ 0 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -16,14 +16,9 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddressList;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import sun.util.resources.LocaleData;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyDingding.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-06-29
+ * @since 2023-05-26
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -102,6 +102,12 @@ public class CompanyDingding extends Model<CompanyDingding> {
     @TableField("oa_manager_dingid")
     private String oaManagerDingid;
 
+    /**
+     * 与钉钉通讯录结构一致
+     */
+    @TableField("sync_contact")
+    private Integer syncContact;
+
 
     @Override
     protected Serializable pkVal() {

+ 27 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Contract.java

@@ -1,12 +1,10 @@
 package com.management.platform.entity;
 
+import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import com.baomidou.mybatisplus.annotation.TableId;
-
-import java.math.BigDecimal;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 
@@ -18,11 +16,11 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
- *
+ * 
  * </p>
  *
  * @author Seyason
- * @since 2022-11-29
+ * @since 2023-05-24
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -43,12 +41,6 @@ public class Contract extends Model<Contract> {
     @TableField("company_id")
     private Integer companyId;
 
-    /**
-     * 创建者Id
-     */
-    @TableField("creator_id")
-    private String creatorId;
-
     /**
      * 创建者姓名
      */
@@ -61,6 +53,13 @@ public class Contract extends Model<Contract> {
     @TableField(exist = false)
     private String creatorWxCorpId;
 
+    /**
+     * 创建者id
+     */
+    @TableField("creator_id")
+    private String creatorId;
+
+
     /**
      * 合同开始时间
      */
@@ -83,6 +82,12 @@ public class Contract extends Model<Contract> {
     @TableField("number")
     private String number;
 
+    /**
+     * 关联项目id
+     */
+    @TableField("project_id")
+    private Integer projectId;
+
     /**
      * 合同名称
      */
@@ -93,7 +98,7 @@ public class Contract extends Model<Contract> {
      * 金额
      */
     @TableField("amounts")
-    private Double amounts;
+    private BigDecimal amounts;
 
     /**
      * 合同类型的id
@@ -107,6 +112,7 @@ public class Contract extends Model<Contract> {
     @TableField(exist = false)
     private String typeName;
 
+
     /**
      * 审核人Id
      */
@@ -114,11 +120,12 @@ public class Contract extends Model<Contract> {
     private String checkerId;
 
     /**
-     * 0-审核通过,1-待审核,2-驳回, 3-导入待审核
+     * 0-审核通过,1-待审核,2-驳回
      */
     @TableField("status")
     private Integer status;
 
+
     /**
      * 创建时间
      */
@@ -133,6 +140,12 @@ public class Contract extends Model<Contract> {
     @TableField("remarks")
     private String remarks;
 
+    /**
+     * 到款金额
+     */
+    @TableField("payment")
+    private BigDecimal payment;
+
 
     @Override
     protected Serializable pkVal() {

+ 7 - 22
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -2,6 +2,8 @@ package com.management.platform.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -184,28 +186,6 @@ public class Project extends Model<Project> {
     @PropertyMsg("基线费用")
     @TableField("base_fee")
     private Integer baseFee;
-
-    /**
-     * 一般费用
-     */
-    @PropertyMsg("一般费用")
-    @TableField("fee_normal")
-    private Double feeNormal;
-
-    /**
-     * 差旅费
-     */
-    @PropertyMsg("差旅费")
-    @TableField("fee_travel")
-    private Double feeTravel;
-
-    /**
-     * 外包费用
-     */
-    @PropertyMsg("外包费用")
-    @TableField("fee_outsourcing")
-    private Double feeOutsourcing;
-
     /**
      * 人工成本
      */
@@ -459,6 +439,11 @@ public class Project extends Model<Project> {
     @TableField(exist = false)
     private String residueEstimatedWorkTime;
 
+    @TableField(exist = false)
+    List<Map<String, Object>> projectExpenseFeeList;
+
+    @TableField(exist = false)
+    private BigDecimal payment;
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectMapper.java

@@ -54,6 +54,7 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<Map<String,Object>> getAllProjectCost(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId,List<Integer> inchagerIds);
 
     List<Project> getProjectInAndOut(Integer companyId, Integer pageStart, Integer pageSize, Integer projectId,List<Integer> inchagerIds);
+    List<Map<String,Object>> getProjectExpenseFee(Integer companyId, List<Integer> projectIds);
 
     List<CustomerProject> getCustomerProjectInAndOut(Integer companyId, Integer pageStart, Integer pageSize,Integer customerId,Integer projectId);
 

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

@@ -23,9 +23,9 @@ public interface ContractService extends IService<Contract> {
 
     HttpRespMsg ExportContract(HttpServletRequest request, String number, String name, String typeName, Integer status, String startDate, String endDate);
 
-    HttpRespMsg addContract(HttpServletRequest request, Contract contract);
+    HttpRespMsg addContract(HttpServletRequest request, Contract contract, String paymentListStr);
 
-    HttpRespMsg editContract(HttpServletRequest request, Contract contract);
+    HttpRespMsg editContract(HttpServletRequest request, Contract contract, String paymentListStr);
 
     HttpRespMsg importContract(HttpServletRequest request, MultipartFile file);
 

+ 40 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -1,5 +1,6 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -51,6 +52,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     @Resource
     private ContractMapper contractMapper;
     @Resource
+    private ContractPaymentMapper contractPaymentMapper;
+    @Resource
     private UserMapper userMapper;
     @Resource
     private CompanyMapper companyMapper;
@@ -164,6 +167,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 contractPageVO.setCheckerId(contract.getCheckerId());
                 contractPageVO.setRemarks(contract.getRemarks());
                 contractPageVO.setAmounts(contract.getAmounts());
+                contractPageVO.setProjectId(contract.getProjectId());
+                contractPageVO.setPayment(contract.getPayment());
                 if (contract.getStatus().equals(2)){
                     for (Map<String, Object> contractLog : contractLogs) {
                         if (contractLog.get("contractId").toString().equals(contract.getId().toString())){
@@ -296,7 +301,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
      * @return
      */
     @Override
-    public HttpRespMsg addContract(HttpServletRequest request, Contract contract) {
+    public HttpRespMsg addContract(HttpServletRequest request, Contract contract, String paymentListStr) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "新增合同");
@@ -320,7 +325,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             }
         }
         //合同金额不可为负
-        if (contract.getAmounts()!=null && contract.getAmounts() < 0){
+        if (contract.getAmounts()!=null && contract.getAmounts().compareTo(BigDecimal.ZERO) < 0){
             httpRespMsg.msg = MessageUtils.message("Contract.amountNegative");
             return httpRespMsg;
         }
@@ -328,6 +333,20 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         contract.setCreatorId(user.getId());
         contract.setCompanyId(user.getCompanyId());
         contractMapper.insert(contract);
+
+        if (StringUtils.isNotBlank(paymentListStr)){
+            List<ContractPayment> contractPaymentList = JSON.parseArray(paymentListStr, ContractPayment.class);
+            BigDecimal bg = new BigDecimal("0");
+            for (ContractPayment contractPayment:contractPaymentList) {
+                contractPayment.setContractId(contract.getId());
+                contractPaymentMapper.insert(contractPayment);
+                if (contractPayment.getIsPayed()) {
+                    bg = bg.add(contractPayment.getAmount());
+                }
+            }
+            contract.setPayment(bg);
+        }
+
         ContractLog contractLog = new ContractLog();
         contractLog.setCompanyId(user.getCompanyId());
         contractLog.setCreatorId(user.getId());
@@ -349,7 +368,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
      * @return
      */
     @Override
-    public HttpRespMsg editContract(HttpServletRequest request, Contract contract) {
+    public HttpRespMsg editContract(HttpServletRequest request, Contract contract, String paymentListStr) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         User user = userMapper.selectById(request.getHeader("token"));
         List<SysRichFunction> functionContractList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "管理全部合同");
@@ -364,20 +383,35 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 return httpRespMsg;
             }
             //合同金额不可为负
-            if (contract.getAmounts()!=null && contract.getAmounts() < 0){
+            if (contract.getAmounts()!=null && contract.getAmounts().compareTo(BigDecimal.ZERO) < 0){
                 httpRespMsg.setError(MessageUtils.message("Contract.amountNegative"));
                 return httpRespMsg;
             }
             //合同编号不可重复
             if (StringUtils.isNotBlank(contract.getNumber())){
-                Contract number = contractMapper.selectOne(new QueryWrapper<Contract>().eq("number", contract.getNumber()));
+                Contract number = contractMapper.selectOne(new QueryWrapper<Contract>().eq("number", contract.getNumber()).eq("company_id", contract.getCompanyId()));
                 if (number != null && !number.getId().equals(contract.getId())){
                     httpRespMsg.setError("[" + contract.getNumber() + "]" + MessageUtils.message("contract.numberRepeat"));
                     return httpRespMsg;
                 }
             }
             contract.setStatus(1);
+            contract.setPayment(new BigDecimal(0));
             contract.setIndate(null);
+            //更新回款计划
+            if (StringUtils.isNotBlank(paymentListStr)){
+                List<ContractPayment> contractPaymentList = JSON.parseArray(paymentListStr, ContractPayment.class);
+                contractPaymentMapper.delete(new QueryWrapper<ContractPayment>().eq("contract_id",contract.getId()));
+                BigDecimal bg = new BigDecimal("0");
+                for (ContractPayment contractPayment:contractPaymentList) {
+                    contractPaymentMapper.insert(contractPayment);
+                    if (contractPayment.getIsPayed()) {
+                        bg = bg.add(contractPayment.getAmount());
+                    }
+                }
+                System.out.println("回款金额: " + bg);
+                contract.setPayment(bg);
+            }
             contractMapper.updateById(contract);
             boolean flag = false;
             UpdateWrapper<Contract> contractUpdateWrapper = new UpdateWrapper<>();
@@ -549,7 +583,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                     msg.setError(MessageUtils.message("Contract.amountNegativeByCell",dataIndex));
                     return msg;
                 }else if (StringUtils.isNotBlank(amounts)){
-                    item.setAmounts(Double.parseDouble(amounts));
+                    item.setAmounts(new BigDecimal(Double.parseDouble(amounts)));
                 }
                 if (StringUtils.isNotBlank(remarks)){
                     item.setRemarks(remarks.trim());

+ 4 - 21
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -786,7 +786,7 @@ public class DingDingServiceImpl implements DingDingService {
                 //同步部门数据
                 adjustDepartment(dingding);
                 //从temp表调整人员到user表
-                adjustUserFromTemp(dingding, dingding.getCorpid().equals("dinga36903d5ec45afca"));
+                adjustUserFromTemp(dingding);
             } else {
                 System.err.println("获取通讯录范围出错:" + json.toJSONString());
             }
@@ -864,7 +864,8 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    private void adjustUserFromTemp(CompanyDingding dingding, boolean syncUserDept) {
+    private void adjustUserFromTemp(CompanyDingding dingding) {
+        boolean syncUserDept = (dingding.getSyncContact() == 1);
         SysRole defaultRole = null;
         List<SysRole> droleList = sysRoleMapper.selectList(new QueryWrapper<SysRole>().eq("company_id", dingding.getCompanyId()).eq("is_default", 1));
         if (droleList.size() > 0) {
@@ -922,7 +923,7 @@ public class DingDingServiceImpl implements DingDingService {
                     int dpid = duser.getDdDeptid();
                     if (dpid != 1) {
                         Optional<Department> first = allDeptList.stream().filter(item -> item.getDdDeptid() != null && item.getDdDeptid().equals(dpid)).findFirst();
-                        if (first.isPresent()) {
+                        if (first.isPresent() && oldUser.getDepartmentId() == 0) {
                             Department department = first.get();
                             upUser.setDepartmentId(department.getDepartmentId());
                             upUser.setDepartmentCascade(convertDepartmentIdToCascade(department.getDepartmentId()));
@@ -943,24 +944,6 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-//    private void getUserDetailInfo(User user, String accessToken) throws ApiException {
-//        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
-//        OapiV2UserGetRequest req = new OapiV2UserGetRequest();
-//        req.setUserid(user.getDingdingUserid());
-//        req.setLanguage("zh_CN");
-//        OapiV2UserGetResponse rsp = null;
-//        rsp = client.execute(req, accessToken);
-//        String body = rsp.getBody();
-//        JSONObject json = JSONObject.parseObject(body);
-//        JSONObject result = json.getJSONObject("result");
-//        String name = result.getString("name");
-//        String unionId = result.getString("unionid");
-//        user.setDingdingUnionid(unionId);
-//        user.setName(name);
-//        userMapper.updateById(user);
-//    }
-
-
     //获取授权企业的accessToken
     private OapiServiceGetCorpTokenResponse getAuthCorpAccessToken(String corpid, String suiteTicket) throws ApiException {
         DefaultDingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");

+ 11 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java

@@ -325,16 +325,6 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 if (field3 != null)field3.setCellType(CellType.STRING);
 
                 finance.setCompanyId(companyId);
-//                Optional<User> userOp;
-//                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-//                    Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(name)).findFirst();
-//                    userOp= userList.stream().filter(u ->((optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid())))).findFirst();
-//                }else {
-//                    userOp= userList.stream().filter(u -> u.getName().equals(name)).findFirst();
-//                }
-//                if(userOp.isPresent()){
-//
-//                }
                 finance.setName(name);
                 //工号模式下,工号也不是必填,有工号优先按工号匹配
                 if (includeJobNumber) {
@@ -1336,7 +1326,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
             });
 
-
+            List<String> missingFinanceUserIds = new ArrayList<>();
             for (Map<String, Object> map : projectTimeList) {
                 Integer projectId = (Integer) map.get("projectId");
                 String curProject = (String) map.get("project");
@@ -1348,6 +1338,10 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     cost = first.get().getHourCost().multiply(new BigDecimal(workingTime));
                 } else {
                     System.out.println("财务数据中未找到用户:"+creatorId);
+                    if (!missingFinanceUserIds.contains(creatorId)) {
+                        missingFinanceUserIds.add(creatorId);
+                    }
+                    continue;
                 }
                 if (curProject == null) {
                     System.out.println("projectId="+projectId+", creatorId="+creatorId);
@@ -1457,6 +1451,12 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             resultMap.put("costList", pList);
             resultMap.put("noProjectItem", noProjectItem);
             resultMap.put("totalMoneyCost", totalMoneyCost);
+            if (missingFinanceUserIds.size() > 0) {
+                List<Map<String, Object>> userList = userMapper.getSimpleNameList(new QueryWrapper<User>().in("id", missingFinanceUserIds));
+                resultMap.put("missingFinanceUserList", userList);
+            } else {
+                resultMap.put("missingFinanceUserList", new ArrayList<>());
+            }
             httpRespMsg.data = resultMap;
         } catch (NullPointerException e) {
             e.printStackTrace();

+ 91 - 20
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -2271,6 +2271,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 inchagerIds.add(-1);
             }
         }
+        //获取表头
+        List<ExpenseMainType> mainTypeList = expenseMainTypeMapper.selectList(new QueryWrapper<ExpenseMainType>().eq("company_id", companyId));
+
         //撤销的项目不算
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         queryWrapper.and(wrapper->wrapper.isNull("status").or().ne("status", 3));
@@ -2279,7 +2282,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         int total = projectMapper.selectCount(queryWrapper);
         int pageStart = (pageIndex -1) * pageSize;
-        System.out.println("companyId="+companyId+", pageStart="+pageStart+", pageSize="+pageSize);
         List<Map<String, Object>> projectTask = projectMapper.getAllProjectCost(companyId, pageStart, pageSize, projectId, inchagerIds);
         List<Integer> projectIdCollect = projectTask.stream().map(pt -> Integer.valueOf(String.valueOf(pt.get("id")))).distinct().collect(Collectors.toList());
         projectIdCollect.add(-1);
@@ -2303,6 +2305,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 bigDecimal=bigDecimal.add(new BigDecimal(sum));
             }
             map.put("costDetail",itemList);
+            bigDecimal = bigDecimal.add(new BigDecimal(map.get("feeMan").toString()));
             double totalFee = bigDecimal.doubleValue();
             //totalFee保留小数点后两位
             totalFee = Double.parseDouble(df.format(totalFee));
@@ -2378,10 +2381,11 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 data.add(String.valueOf(sum));
                 bigDecimal=bigDecimal.add(new BigDecimal(sum));
             }
+            bigDecimal = bigDecimal.add(new BigDecimal(item.get("feeMan").toString()));
             double totalFee = bigDecimal.doubleValue();
             //totalFee保留小数点后两位
             totalFee = Double.parseDouble(df.format(totalFee));
-            data.add(totalFee+"");
+            data.add(totalFee +"");
             exportList.add(data);
         }
         //String fileName = "项目成本报表_"+System.currentTimeMillis();
@@ -2416,6 +2420,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 inchagerIds.add(-1);
             }
         }
+        //获取表头
+        List<ExpenseMainType> mainTypeList = expenseMainTypeMapper.selectList(new QueryWrapper<ExpenseMainType>().eq("company_id", companyId));
+
         //撤销的项目不算
         QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
         queryWrapper.and(wrapper->wrapper.isNull("status").or().ne("status", 3));
@@ -2424,10 +2431,21 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         }
         int total = projectMapper.selectCount(queryWrapper);
         int pageStart = (pageIndex -1) * pageSize;
-        List projectTask = projectMapper.getProjectInAndOut(companyId, pageStart, pageSize, projectId,inchagerIds);
+        List<Project> projectTask = projectMapper.getProjectInAndOut(companyId, pageStart, pageSize, projectId,inchagerIds);
+        List<Integer> collect = projectTask.stream().map(Project::getId).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            List<Map<String, Object>> projectExpenseFee = projectMapper.getProjectExpenseFee(companyId, collect);
+            projectTask.forEach(p->{
+                p.setProjectExpenseFeeList(projectExpenseFee.stream().filter(pef->pef.get("projectId").equals(p.getId())).collect(Collectors.toList()));
+                double amount = p.getProjectExpenseFeeList().stream().mapToDouble(pef -> Double.parseDouble(pef.get("amount").toString())).sum();
+                p.setBudget(amount + (p.getFeeMan()==null?0:p.getFeeMan()));
+            });
+        }
+
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         Map<String, Object> map = new HashMap<>();
         map.put("records", projectTask);
+        map.put("mainTypeList", mainTypeList);
         map.put("total", total);
         httpRespMsg.data = map;
         return httpRespMsg;
@@ -2459,6 +2477,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         //通过公司id获取该公司所有的项目列表
         User user = userMapper.selectById(request.getHeader("Token"));
         Integer companyId = user.getCompanyId();
+        Company company = companyMapper.selectById(companyId);
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
         List<Project> projectAllList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", companyId));
         List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "全部项目任务报表");
@@ -2477,29 +2496,81 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 inchagerIds.add(-1);
             }
         }
-        QueryWrapper<Project> queryWrapper = new QueryWrapper<Project>().eq("company_id", companyId);
+        //获取表头
+        List<ExpenseMainType> mainTypeList = expenseMainTypeMapper.selectList(new QueryWrapper<ExpenseMainType>().eq("company_id", companyId));
         List<Project> projectList = projectMapper.getProjectInAndOut(companyId, null, null, null,inchagerIds);
+        List<Integer> collect = projectList.stream().map(Project::getId).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            List<Map<String, Object>> projectExpenseFee = projectMapper.getProjectExpenseFee(companyId, collect);
+            projectList.forEach(p->{
+                p.setProjectExpenseFeeList(projectExpenseFee.stream().filter(pef->pef.get("projectId").equals(p.getId())).collect(Collectors.toList()));
+                double amount = p.getProjectExpenseFeeList().stream().mapToDouble(pef -> Double.parseDouble(pef.get("amount").toString())).sum();
+                p.setBudget(amount + (p.getFeeMan()==null?0:p.getFeeMan()));
+            });
+        }
+
         List<List<String>> exportList = new ArrayList<>();
-        //String[] titles = {"项目编号", "项目名称", "合同金额", "人工成本", "一般费用", "差旅费用","外包费用", "总费用", "利润", "利润率"};
-        String[] titles = {MessageUtils.message("entry.projectId"), MessageUtils.message("entry.projectName"), MessageUtils.message("entry.contract"), MessageUtils.message("entry.laborCost"), MessageUtils.message("excel.genExp"), MessageUtils.message("excel.traExp"),MessageUtils.message("excel.OutExp"), MessageUtils.message("excel.totalExp"), MessageUtils.message("excel.profit"), MessageUtils.message("excel.profitMargin")};
+        //String[] titles = {"项目编号", "项目名称", "合同金额", "人工成本", "自定义费用类型"...};
+        String[] titles = {MessageUtils.message("entry.projectId"), MessageUtils.message("entry.projectName"), MessageUtils.message("entry.contract")};
+        ArrayList<String> strings = Lists.newArrayList(titles);
+        if (company.getPackageContract() == 1) {
+            strings.add("已回款金额");
+        }
+        strings.add(MessageUtils.message("entry.laborCost"));
+        mainTypeList.forEach(m->{
+            strings.add(m.getName());
+        });
+        strings.add(MessageUtils.message("excel.totalExp"));
+        if (company.getPackageContract() == 1) {
+            strings.add("已回款利润");
+            strings.add("已回款利润率");
+        }
+        strings.add(MessageUtils.message("excel.profit"));
+        strings.add(MessageUtils.message("excel.profitMargin"));
+        titles = strings.toArray(new String[0]);
+
         exportList.add(Lists.list(titles));
         for (Project project : projectList) {
             List<String> data = new ArrayList<>();
             data.add(project.getProjectCode());
             data.add(project.getProjectName());
             data.add(project.getContractAmount() != null?project.getContractAmount().toString():"");
+            if (company.getPackageContract() == 1) {
+                data.add(project.getPayment() != null?project.getPayment().toString():"");
+            }
             data.add(project.getFeeMan().toString());
-            data.add(project.getFeeNormal().toString());
-            data.add(project.getFeeTravel().toString());
-            data.add(project.getFeeOutsourcing().toString());
-            double totalFee = project.getFeeMan() + project.getFeeNormal()+ project.getFeeTravel()+ project.getFeeOutsourcing();
-            data.add(totalFee+"");
+            for (ExpenseMainType mainType : mainTypeList) {
+                if (project.getProjectExpenseFeeList() != null) {
+                    Optional<Map<String, Object>> first = project.getProjectExpenseFeeList().stream().filter(pef -> pef.get("typeId").equals(mainType.getId())).findFirst();
+                    if (first.isPresent()) {
+                        data.add(first.get().get("amount").toString());
+                    } else {
+                        data.add("");
+                    }
+                } else {
+                    data.add("");
+                }
+            }
+            double totalFee = project.getBudget();
+            data.add(new java.text.DecimalFormat("#0.00").format(totalFee));
+            if (company.getPackageContract() == 1) {
+                //已回款利润
+                double profitPayment = project.getPayment().doubleValue() - totalFee;
+                double profitRate = profitPayment / project.getPayment().doubleValue();
+                data.add(new java.text.DecimalFormat("#0.00").format(profitPayment));
+                if (profitRate > 0) {
+                    data.add(new java.text.DecimalFormat("#0.0").format(100*profitRate)+"%");
+                } else {
+                    data.add("-");
+                }
+            }
+
             if (project.getContractAmount() != null && project.getContractAmount() > 0) {
                 double profitAmt = project.getContractAmount() - totalFee;
                 data.add(profitAmt+"");
                 data.add(new java.text.DecimalFormat("#0.0").format((100*profitAmt/project.getContractAmount()))+"%");
             } else {
-                double profitAmt = -totalFee;
+                double profitAmt = 0 -totalFee;
                 data.add(profitAmt+"");
                 data.add("");
             }
@@ -2535,10 +2606,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             data.add("");
             data.add(project.getContractAmount() != null?project.getContractAmount().toString():"");
             data.add(project.getFeeMan().toString());
-            data.add(project.getFeeNormal().toString());
-            data.add(project.getFeeTravel().toString());
-            data.add(project.getFeeOutsourcing().toString());
-            double totalFee = project.getFeeMan() + project.getFeeNormal()+ project.getFeeTravel()+ project.getFeeOutsourcing();
+//            data.add(project.getFeeNormal().toString());
+//            data.add(project.getFeeTravel().toString());
+//            data.add(project.getFeeOutsourcing().toString());
+            double totalFee = project.getFeeMan();
             data.add(totalFee+"");
             if (project.getContractAmount() != null && project.getContractAmount() > 0) {
                 double profitAmt = project.getContractAmount() - totalFee;
@@ -2560,10 +2631,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 dataChild.add(child.getProjectNames());
                 dataChild.add(child.getContractAmount() != null?child.getContractAmount().toString():"");
                 dataChild.add(child.getFeeMan().toString());
-                dataChild.add(child.getFeeNormal().toString());
-                dataChild.add(child.getFeeTravel().toString());
-                dataChild.add(child.getFeeOutsourcing().toString());
-                double totalFeeChild = child.getFeeMan() + child.getFeeNormal()+ child.getFeeTravel()+ child.getFeeOutsourcing();
+//                dataChild.add(child.getFeeNormal().toString());
+//                dataChild.add(child.getFeeTravel().toString());
+//                dataChild.add(child.getFeeOutsourcing().toString());
+                double totalFeeChild = child.getFeeMan();
                 dataChild.add(totalFeeChild+"");
                 if (child.getContractAmount() != null && child.getContractAmount() > 0) {
                     double profitAmt = child.getContractAmount() - totalFeeChild;

+ 2 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDingdingMapper.xml

@@ -19,11 +19,12 @@
         <result column="web_url" property="webUrl" />
         <result column="pc_web_url" property="pcWebUrl" />
         <result column="oa_manager_dingid" property="oaManagerDingid" />
+        <result column="sync_contact" property="syncContact" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id, inner_appkey, inner_appsecret, inner_token, inner_expire_time, web_url, pc_web_url, oa_manager_dingid
+        corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id, inner_appkey, inner_appsecret, inner_token, inner_expire_time, web_url, pc_web_url, oa_manager_dingid, sync_contact
     </sql>
 
     <select id="getDingdingCompanyList" resultType="com.management.platform.entity.CompanyDingding">
@@ -39,5 +40,4 @@
             </foreach>
         </if>
     </select>
-
 </mapper>

+ 14 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractMapper.xml

@@ -6,26 +6,29 @@
     <resultMap id="BaseResultMap" type="com.management.platform.entity.Contract">
         <id column="id" property="id" />
         <result column="company_id" property="companyId" />
-        <result column="number" property="number" />
         <result column="creator_id" property="creatorId" />
+        <result column="start_date" property="startDate" />
+        <result column="end_date" property="endDate" />
+        <result column="number" property="number" />
+        <result column="project_id" property="projectId" />
         <result column="name" property="name" />
         <result column="amounts" property="amounts" />
         <result column="type_id" property="typeId" />
-        <result column="type_name" property="typeName" />
+        <result column="checkerId" property="checkerId" />
         <result column="status" property="status" />
         <result column="indate" property="indate" />
         <result column="remarks" property="remarks" />
+        <result column="payment" property="payment" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, creator_id, number, name, amounts, type_id, type_name,status, indate, remarks
+        id, company_id, creator_id, start_date, end_date, number, project_id, name, amounts, type_id, checkerId, status, indate, remarks, payment
     </sql>
-
     <select id="selectContract" resultType="com.management.platform.entity.Contract">
         select contract.id,contract.company_id,contract.creator_id,contract.number,contract.name,contract.amounts,contract.type_id,contract_type.type_name,contract.status,contract.indate,contract.remarks,
         contract.start_date as startDate,contract.end_date as endDate,
-        user.name as creatorName,user.corpwx_userid as creatorWxCorpId
+        user.name as creatorName,user.corpwx_userid as creatorWxCorpId, contract.project_id, contract.payment
         from contract
         left join contract_type
         on contract.type_id = contract_type.id
@@ -33,21 +36,21 @@
         on contract.creator_id = user.id
         where contract.company_id = #{companyId}
         <if test="number!=null">
-        and number like #{number}
+            and number like #{number}
         </if>
         <if test="name!=null">
-        and name like #{name}
+            and name like #{name}
         </if>
         <if test="typeName!=null">
-        and contract_type.id = #{typeName}
+            and contract_type.id = #{typeName}
         </if>
         <if test="status!=null">
-        and status = #{status}
+            and status = #{status}
         </if>
         <if test="startDate!=null and endDate !=null">
-        and indate between #{startDate} and #{endDate}
+            and indate between #{startDate} and #{endDate}
         </if>
-        order by indate desc
+        order by contract.id desc
         <if test="pageStart!=null and pageSize!=null">
             limit #{pageStart},#{pageSize}
         </if>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 22 - 22
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml


+ 1 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -715,8 +715,7 @@
         IFNULL(project.project_name,'其他') as project,report.creator_id AS creatorId,sum(working_time) as workingTime, SUM(cost) as cost
         FROM report
         left join project on project.id = report.project_id
-        WHERE report.creator_id IN
-        (select id from user where company_id = #{companyId})
+        WHERE report.company_id = #{companyId}
         and state = 1
         <if test="startDate != null">
             AND report.create_date &gt;= #{startDate}

+ 195 - 25
fhKeeper/formulahousekeeper/timesheet/src/views/contract/index.vue

@@ -68,6 +68,12 @@
       <el-table-column prop="amounts" :label="$t('contractamount')" min-width="130" align="right" header-align="center">
         <span slot-scope="scope">¥ {{scope.row.amounts ? scope.row.amounts.toFixed(2) : '0.00'}}</span>
       </el-table-column>
+      <el-table-column prop="payment" label="已回款金额" min-width="130" align="right" header-align="center">
+        <span slot-scope="scope">¥ {{scope.row.payment ? scope.row.payment.toFixed(2) : '0.00'}}</span>
+      </el-table-column>
+      <el-table-column prop="payment" label="已回款进度" min-width="130" align="right" header-align="center">
+        <span slot-scope="scope">{{scope.row.payment ? (100*scope.row.payment/scope.row.amounts).toFixed(1) + '%': '0%'}}</span>
+      </el-table-column>
       <el-table-column prop="typeName" :label="$t('he-tong-lei-xing')" min-width="140" align="center"></el-table-column>
       <el-table-column prop="status" :label="$t('state.states')" min-width="100" align="center">
         <template slot-scope="scope">
@@ -101,23 +107,31 @@
       <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
         <el-form ref="contractForm" :model="contractForm" :rules="rules" label-width="120px" class="contractForm">
           <el-form-item :label="$t('contractno')">
-            <el-input v-model="contractForm.number" :maxlength="50" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
+            <el-input v-model="contractForm.number" :disabled="contractForm.status == 0" :maxlength="50" style="width:260px;" show-word-limit :placeholder="$t('peaseenterthe')" clearable @input="searchProject"></el-input>
+            <span style="margin-left:20px;">关联项目</span>
+            <el-select v-model="contractForm.projectId" filterable clearable style="width:300px;" :disabled="contractForm.status == 0">
+              <el-option v-for="item in projectList" :key="item.id" :label="item.projectName  + '\u3000' + (item.projectCode == null?'':item.projectCode)" :value="item.id" >
+                    <span style="float: left; color: #8492a6; font-size: 13px;">{{ item.projectCode }}</span>
+                    <span style="float: right;">{{ item.projectName }}</span>
+                </el-option>
+            </el-select>
           </el-form-item>
           <el-form-item :label="$t('he-tong-ming-cheng')" prop='name'>
-            <el-input v-model="contractForm.name" :maxlength="100" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
+            <el-input v-model="contractForm.name" :disabled="contractForm.status == 0" :maxlength="100" show-word-limit :placeholder="$t('peaseenterthe')" clearable></el-input>
           </el-form-item>
           <el-form-item :label="$t('contractamount')">
-            <el-input v-model="contractForm.amounts" id="contract_amount" :placeholder="$t('peaseenterthe')" @keyup.native="restrictNumber('contract_amount')" clearable>
+            <el-input v-model="contractForm.amounts" :disabled="contractForm.status == 0" id="contract_amount" :placeholder="$t('peaseenterthe')" @keyup.native="restrictNumber('contract_amount')" clearable>
               <span slot="prefix">¥</span>
             </el-input>
           </el-form-item>
           <el-form-item :label="$t('he-tong-lei-xing')">
-            <el-select v-model="contractForm.typeId" :placeholder="$t('defaultText.pleaseChoose')" style="width:100%">
+            <el-select v-model="contractForm.typeId":disabled="contractForm.status == 0" :placeholder="$t('defaultText.pleaseChoose')" style="width:100%">
               <el-option v-for="item in typeList" :key="item.id" :label="item.typeName" :value="item.id"></el-option>
             </el-select>
           </el-form-item>
           <el-form-item :label="$t('schedulestarttime')">
             <el-date-picker
+            :disabled="contractForm.status == 0"
               v-model="contractForm.startDate"
               value-format="yyyy-MM-dd"
               type="date"
@@ -126,6 +140,7 @@
             </el-date-picker>
             <span style="float:right;">{{$t('scheduleendtime')}}
             <el-date-picker
+            :disabled="contractForm.status == 0"
               style="margin-left: 15px;"
               v-model="contractForm.endDate"
               value-format="yyyy-MM-dd"
@@ -136,8 +151,43 @@
             </span>
           </el-form-item>
           <el-form-item :label="$t('bei-zhu')">
-            <el-input v-model="contractForm.remarks" :placeholder="$t('peaseenterthe')" type="textarea" :rows="3" clearable></el-input>
+            <el-input v-model="contractForm.remarks" :disabled="contractForm.status == 0" :placeholder="$t('peaseenterthe')" type="textarea" :rows="3" clearable></el-input>
+          </el-form-item>
+          <el-form-item label="回款计划">
+            <el-table :data="contractPaymentList" size="small" :key="Math.random()" :height="'300px'" show-header="false" style="margin-top:10px;">
+                  <el-table-column prop="isPayed" >
+                      <template slot-scope="scope">
+                          <el-checkbox v-model="scope.row.isPayed" >已回款</el-checkbox>
+                      </template>
+                      <template slot="header" >
+                          <span style="font-size:14px;font-weight:normal;">是否已回款</span>
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="payDate"  label="回款日期" width="210">
+                      <template slot-scope="scope">
+                          <div><el-date-picker type="date" v-model="scope.row.payDate" style="width:200px;" :placeholder="$t('optiondate')" value-format="yyyy-MM-dd"></el-date-picker></div>
+                      </template>
+                  </el-table-column>
+                  
+                  <el-table-column prop="amount" label="回款金额">
+                      <template slot-scope="scope">
+                        <el-input v-model="scope.row.amount" :id="'payment_amount'+scope.$index" :placeholder="$t('peaseenterthe')" maxlength="10" clearable>
+                          <span slot="prefix">¥</span>
+                        </el-input>
+                      </template>
+                  </el-table-column>
+                  <el-table-column  width="80">
+                      <template slot-scope="scope">
+                          <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.$index)"></el-button>
+                      </template>
+                      <template slot="header" >
+                          <el-link type="primary" :underline="false" @click="addItem">{{ $t('addTian') }}</el-link>
+                      </template>
+                  </el-table-column>
+              </el-table>
           </el-form-item>
+          
+          
           <el-form-item label-width="0" class="contractFiles">
             <div class="contractFiles_title">{{ $t('fu-jian') }}
               <el-upload style="float:right;margin-right:5%;" ref="uploadFile" action="#" :http-request="httpRequest" :on-change="fileChange" :auto-upload="false" :show-file-list="false">
@@ -217,6 +267,30 @@
           <el-form-item style="width:100%" :label="$t('bei-zhu')">
             {{contractForm.remarks}}
           </el-form-item>
+          <el-form-item style="width:100%" label="回款计划">
+            <el-table :data="contractPaymentList" size="small" :key="Math.random()" :height="'300px'" show-header="false" style="margin-top:10px;">
+                  <el-table-column prop="isPayed" >
+                      <template slot-scope="scope">
+                        {{ scope.row.isPayed?'已回款':'未回款' }}
+                      </template>
+                      <template slot="header" >
+                          <span style="font-size:14px;font-weight:normal;">是否已回款</span>
+                      </template>
+                  </el-table-column>
+                  <el-table-column prop="payDate"  label="回款日期" width="210">
+                      <template slot-scope="scope">
+                          <div>{{ scope.row.payDate }}</div>
+                      </template>
+                  </el-table-column>
+                  
+                  <el-table-column prop="amount" label="回款金额">
+                      <template slot-scope="scope">
+                        <div>{{ scope.row.amount }}</div>
+                      </template>
+                  </el-table-column>
+              </el-table>
+          </el-form-item>
+          
           <el-form-item label-width="0" class="contractFiles">
             <div class="contractFiles_title">{{ $t('fu-jian') }}</div>
             <el-table :data="fileList" :header-cell-style="{'font-weight':'normal'}" highlight-current-row
@@ -299,6 +373,7 @@
 export default {
   data() {
     return {
+      contractPaymentList: [],
       user: JSON.parse(sessionStorage.getItem("user")),
       permissions: JSON.parse(sessionStorage.getItem("permissions")),
       searchField: 0,
@@ -346,7 +421,7 @@ export default {
 
       importDialog: false,
       importLoading: false,
-
+      projectList:[],
       page: 1,
       size: 20,
       total: 0,
@@ -362,6 +437,7 @@ export default {
     };
   },
   mounted() {
+    this.getProjectList();
     this.getContractList()
     this.getContractType()
   },
@@ -387,6 +463,46 @@ export default {
                   }
                 
             },
+        searchProject() {
+          console.log(this.contractForm.number);
+          //按合同编号去匹配项目编号,自动加载关联项目
+          if (this.contractForm.number) {
+              var matchItem = this.projectList.filter(p=>p.projectCode == this.contractForm.number);
+              if (matchItem.length > 0) {
+                   this.contractForm.projectId = matchItem[0].id;
+                   this.contractForm.name = matchItem[0].projectName;
+                   this.contractForm.amount = matchItem[0].contractAmount;
+              }
+          }
+        },
+        //删除合同回款情况
+        deleteItem(index) {
+            this.contractPaymentList.splice(index,1);
+        },
+        //添加合同回款情况
+        addItem() {
+            let p = 0;
+            this.contractPaymentList.push( { contractId:this.contractForm.id, isPayed:false,payDate: null, amount:0.0});
+        },
+        
+        getProjectList() {
+          this.http.post('/contract/getProjectList',{},
+            res => {
+              if(res.code == 'ok'){
+                  this.projectList = res.data;
+              }else{
+                this.$message({
+                  message: res.msg,
+                  type: 'error'
+                })
+              }
+            },err => {
+              this.$message({
+                message: err,
+                type: 'error'
+              })
+            })
+        },  
     disabledStart(date){
       if(this.contractForm.endDate){
         if(date > new Date(this.contractForm.endDate)){
@@ -605,7 +721,27 @@ export default {
       for(let i in this.fileList){
         this.fileList[i].name = this.fileList[i].documentName
       }
-      this.addDialog = true
+      this.addDialog = true;
+      this.getContractPaymentList();
+    },
+    getContractPaymentList() {
+      this.contractPaymentList = [];
+      this.http.post('/contract-payment/getList',{contractId: this.contractForm.id},
+      res => {
+        if(res.code == 'ok'){
+          this.contractPaymentList = res.data;
+        }else{
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      },err => {
+        this.$message({
+          message: err,
+          type: 'error'
+        })
+      })
     },
     deleteContract(){
       this.$confirm(this.$t('que-ding-yao-shan-chu-gai-he-tong-ma'), this.$t('other.prompts'), {
@@ -662,27 +798,33 @@ export default {
           status: status
         }
       }
-      this.http.post('/contract/processContract',parameter,
-      res => {
-        if(res.code == 'ok'){
-          this.getContractList()
-          this.denyReasonDialog = false
-          this.$message({
-            message: status == 0 ? this.$t('state.alreadyPassed') : this.$t('state.rejected'),
-            type: 'success'
-          })
-        }else{
+      this.$confirm('确认审核通过吗,通过后合同基本信息无法修改', this.$t('other.prompts'), {
+        confirmButtonText: this.$t('btn.determine'),
+        cancelButtonText: this.$t('btn.cancel'),
+        type: 'warning'
+      }).then(() => {
+        this.http.post('/contract/processContract',parameter,
+        res => {
+          if(res.code == 'ok'){
+            this.getContractList()
+            this.denyReasonDialog = false
+            this.$message({
+              message: status == 0 ? this.$t('state.alreadyPassed') : this.$t('state.rejected'),
+              type: 'success'
+            })
+          }else{
+            this.$message({
+              message: res.msg,
+              type: 'error'
+            })
+          }
+        },err => {
           this.$message({
-            message: res.msg,
+            message: err,
             type: 'error'
           })
-        }
-      },err => {
-        this.$message({
-          message: err,
-          type: 'error'
         })
-      })
+      }); 
     },
     lookover(row){
       console.log('lookover',row);
@@ -715,13 +857,41 @@ export default {
       for(let i in this.fileList){
         this.fileList[i].name = this.fileList[i].documentName
       }
-      this.lookoverDialog = true
+      this.lookoverDialog = true;
+      this.getContractPaymentList();
     },
     submitInsert(){
       this.$refs.contractForm.validate(valid => {
         if (valid) {
+          //校验回款日期和金额
+          var totalPayment = 0.0;
+          for (var i = 0; i < this.contractPaymentList.length; i++) {
+            if (!this.contractPaymentList[i].payDate) {
+              this.$message({
+                message: '回款日期不能为空',
+                type: 'error'
+              })
+              return;
+            }
+            if (!this.contractPaymentList[i].amount) {
+              this.$message({
+                message: '回款金额不能为0',
+                type: 'error'
+              })
+              return;
+            }
+            totalPayment += parseFloat(this.contractPaymentList[i].amount);
+          }
+          if (totalPayment > parseFloat(this.contractForm.amounts)) {
+            this.$message({
+                message: '总回款金额不得大于合同金额',
+                type: 'error'
+              })
+              return;
+          }
           this.submitLoading = true
           delete this.contractForm.files
+          this.contractForm.paymentListStr = JSON.stringify(this.contractPaymentList);
           this.http.post(this.dialogTitle == this.$t('add') ? '/contract/addContract' : '/contract/editContract',this.contractForm,
           res => {
             this.submitLoading = false

+ 23 - 12
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -307,39 +307,48 @@
                         {{scope.row.contractAmount.toFixed(2)}}
                     </template>
                 </el-table-column>
+                <!--开通合同管理模块的显示已回款金额-->
+                <el-table-column prop="payment" label="已回款金额" width="100" align="right" v-if="user.company.packageContract==1">
+                  <template slot-scope="scope">
+                        {{scope.row.payment.toFixed(2)}}
+                    </template>
+                </el-table-column>
+                
                 <el-table-column prop="feeMan" :label="$t('artificialcost')"   width="100" align="right">
                   <template slot-scope="scope">
                         {{scope.row.feeMan.toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeNormal" :label="$t('generalcost')"  width="100" align="right">
+                <el-table-column v-for="item in list3HeadList" :key="item.id" :label="item.name"  width="100" align="right">
                   <template slot-scope="scope">
-                        {{scope.row.feeNormal.toFixed(2)}}
+                        {{scope.row.projectExpenseFeeList == null?'0.00': (
+                          scope.row.projectExpenseFeeList.filter(expenseItem=>expenseItem.typeId == item.id).length > 0?
+                          scope.row.projectExpenseFeeList.filter(expenseItem=>expenseItem.typeId == item.id)[0].amount.toFixed(2) : '0.00')}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeTravel" :label="$t('travelexpenses')"  width="100" align="right">
+                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
                   <template slot-scope="scope">
-                        {{scope.row.feeTravel.toFixed(2)}}
+                        {{(scope.row.budget).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column prop="feeOutsourcing" :label="$t('outsourcingcost')"  width="100" align="right">
+                <el-table-column  label="已回款利润"  width="100" align="right" v-if="user.company.packageContract == 1">
                   <template slot-scope="scope">
-                        {{scope.row.feeOutsourcing.toFixed(2)}}
+                        {{((scope.row.payment==null?0:scope.row.payment) - (scope.row.budget)).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  :label="$t('totalcostos')"  width="100" align="right">
+                <el-table-column  label="已回款利润率"  width="120" align="right">
                   <template slot-scope="scope">
-                        {{(scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing).toFixed(2)}}
+                        {{(scope.row.payment==null||scope.row.payment==0)?'-':((scope.row.payment - scope.row.budget)*100/scope.row.payment).toFixed(1)+"%"}}
                     </template>
                 </el-table-column>
-                <el-table-column  :label="$t('profits')"  width="100" align="right">
+                <el-table-column  label="合同利润"  width="100" align="right">
                   <template slot-scope="scope">
-                        {{((scope.row.contractAmount==null?0:scope.row.contractAmount) - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing)).toFixed(2)}}
+                        {{((scope.row.contractAmount==null?0:scope.row.contractAmount) - scope.row.budget).toFixed(2)}}
                     </template>
                 </el-table-column>
-                <el-table-column  :label="$t('profitmargin')"  width="100" align="right">
+                <el-table-column  label="合同利润率"  width="100" align="right">
                   <template slot-scope="scope">
-                        {{(scope.row.contractAmount==null||scope.row.contractAmount==0)?'-':((scope.row.contractAmount - (scope.row.feeMan+scope.row.feeNormal+scope.row.feeTravel+scope.row.feeOutsourcing))*100/scope.row.contractAmount).toFixed(1)+"%"}}
+                        {{(scope.row.contractAmount==null||scope.row.contractAmount==0)?'-':((scope.row.contractAmount - scope.row.budget)*100/scope.row.contractAmount).toFixed(1)+"%"}}
                     </template>
                 </el-table-column>
             </el-table>
@@ -1142,6 +1151,7 @@ export default {
 
       list2: [],
       list3: [],
+      list3HeadList: [],
       list4: [],
       list5: [],
       total:0,
@@ -1962,6 +1972,7 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.list3 = res.data.records;
+                this.list3HeadList = res.data.mainTypeList;
                 this.total = res.data.total;
                 this.listLoading = false; 
             } else {

+ 22 - 37
fhKeeper/formulahousekeeper/timesheet/src/views/project/finance.vue

@@ -5,7 +5,7 @@
             <el-form :inline="true">
                 <!-- <el-form-item label="财务核算成本 | 月份选择" style="margin-top:5px;"> -->
                 <el-form-item :label="this.$t('Selectmonth')" >
-                <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="changeMonth" :clearable="false" type="month" :placeholder="$t('Selectmonth')" style="margin-right: 20px"></el-date-picker>
+                <el-date-picker size="small" v-model="date" :editable="false" format="yyyy-MM" value-format="yyyy-MM" @change="loadMonthData" :clearable="false" type="month" :placeholder="$t('Selectmonth')" style="margin-right: 20px"></el-date-picker>
                 <el-link type="primary" :underline="false" @click="audits()" v-if="user.timeType.financeAudit == '1'">{{revaelse}}</el-link>
             </el-form-item>
             <!-- <el-radio-group v-model="radio" @change="switchList" style="margin-left:160px;margin-top:5px;"> -->
@@ -227,7 +227,7 @@
                     <el-radio-button label="1" >{{ $t('Apportionmentofpersonnelcosts') }}</el-radio-button>
                     <el-radio-button label="2">{{ $t('Spreadallpersonnelcosts') }}</el-radio-button>
                 </el-radio-group>
-
+                <span v-if="missingFinanceUserList.length > 0" style="color:red;">检测到有 <el-link @click="showMissingDialog = true">&nbsp;{{ missingFinanceUserList.length }}&nbsp;</el-link> 名已填工时人员在薪资表中无记录</span>
             </el-form-item>
 
             <el-form-item style="float:right;margin-right:20px;" v-if="permissions.financialShare">
@@ -235,12 +235,8 @@
                 <el-link type="primary" :underline="false" @click="exportFinanceDialog=true">{{ $t('ExportingtheAllocationData') }}</el-link>
             </el-form-item>
             
-            <!-- <el-form-item style="float:right;margin-right:30px;" v-if="hasNoProjectUsers">
-                <el-link type="primary" :underline="false" @click="showNoProjectUsers">查看无项目数据</el-link>
-            </el-form-item> -->
         </el-form>
         <!-- 图表 -->
-        <!-- <div id="container" :style="'height:300px;width:'+ widthHtval+'px;'"></div> -->
         <div id="clearfix" :style="'overflow-x: auto;width:100%;padding-bottom: 100px; position: relative; height:300px;'">
              <div id="container" :style="'height: 300px;width:100%;'"></div>
         </div>
@@ -315,34 +311,23 @@
             </div>
         </el-dialog>
 
-        <!--无项目人员列表-->
-        <!-- <el-dialog title="无项目人员列表" v-if="showNPDialog" :visible.sync="showNPDialog" :close-on-click-modal="false" customClass="customWidth" width="1200px">
-            <el-table :data="npUserList" highlight-current-row v-loading="listLoading" 
-            show-summary=true
-            ref="table"
-            :height="400" style="width: 100%;">
-            <el-table-column prop="name" label="姓名" sortable width="150"></el-table-column>
-            <el-table-column prop="monthCost" label="工资"  width="150"></el-table-column>
-            <el-table-column prop="bonus" label="奖金" ></el-table-column>
-            <el-table-column prop="allowance" label="津贴" ></el-table-column>
-            <el-table-column prop="insuranceOld" label="养老保险" ></el-table-column>
-            <el-table-column prop="insuranceMedical" label="医疗保险" ></el-table-column>
-            <el-table-column prop="insuranceLosejob" label="失业保险" ></el-table-column>
-            <el-table-column prop="insuranceInjury" label="工伤保险" ></el-table-column>
-            <el-table-column prop="houseFund" label="住房公积金" ></el-table-column>
-             <el-table-column prop="others" label="其他" ></el-table-column> 
-            <el-table-column :label="item.fieldName" v-for="(item, index) in customCols" :key="item.id" :prop="index==0?'customField1':(index==1?'customField2':(index==2?'customField3':''))">
+        <!--无薪资人员列表-->
+        <el-dialog title="无薪资人员列表" v-if="showMissingDialog" :visible.sync="showMissingDialog" :close-on-click-modal="false" customClass="customWidth" width="600px">
+            <el-table :data="missingFinanceUserList" highlight-current-row v-loading="listLoading" :height="400" style="width: 100%;">
+            <el-table-column type="index"></el-table-column>
+            <el-table-column prop="jobNumber" label="工号" sortable ></el-table-column>
+            <el-table-column prop="name" label="姓名" >
                 <template slot-scope="scope">
-                    {{index==0?scope.row.customField1:(index==1?scope.row.customField2:(index==2?scope.row.customField3:''))}}
+                    <span v-if="user.userNameNeedTranslate == '1'"><ww-open-data type='userName' :openid='scope.row.name'></ww-open-data></span>
+                    <span v-if="user.userNameNeedTranslate != '1'">{{scope.row.name}}</span>
                 </template>
             </el-table-column>
-            <el-table-column prop="totalCost" label="总成本" ></el-table-column>
         </el-table>
             <div slot="footer" class="dialog-footer">
-                <div style="float:left;color:#ff9900;">*以上人员当月尚无投入的项目,请提醒他们填写日报。</div>
-                <el-button type="primary" @click="showNPDialog = false" >关闭</el-button>
+                <div style="float:left;color:#ff9900;">*以上人员当月已填写工时,请导入他们的薪资。</div>
+                <el-button type="primary" @click="showMissingDialog = false" >关闭</el-button>
             </div>
-        </el-dialog> -->
+        </el-dialog>
 
         <el-dialog :title="$t('Customizesalaryitems')" show-header="false" v-if="itemDialog" :visible.sync="itemDialog" :close-on-click-modal="false" customClass="customWidth" width="500px" top="20px">
             <div style="margin-left:30px;">
@@ -581,13 +566,15 @@ import { error } from 'dingtalk-jsapi';
         },
         data() {
             return {
+                showMissingDialog: false,
+                missingFinanceUserList: [],
                 groupByCategory:0,
                 exportFinanceDialog:false,
                 exportMonth:null,
                 exportDialog:false,
                 headerCols:['monthCost','bonus', 'allowance', 'insuranceOld', 'insuranceMedical', 'insuranceLosejob', 'insuranceInjury', 'houseFund', 'customField1','customField2','customField3'],
                 tblCols:[],
-                costListRadio: 0,
+                costListRadio: 1,
                 costSettingLoading: false,
                 chosenNoReportUserIds:[],
                 curPercentVal:{},
@@ -1218,9 +1205,8 @@ import { error } from 'dingtalk-jsapi';
 
                         // console.log(res.data, '图表数据', this.widthHtval)
 
-                        var xList = [], yList = [], list = res.data.costList, 
-                        
-                        totalMoneyCost = res.data.totalMoneyCost;
+                        var xList = [], yList = [], list = res.data.costList, totalMoneyCost = res.data.totalMoneyCost;
+                        this.missingFinanceUserList = res.data.missingFinanceUserList;
                         var nopCost = 0;
                         if (res.data.noProjectItem.project != null) {
                             this.hasNoProjectUsers = true;
@@ -1390,13 +1376,13 @@ import { error } from 'dingtalk-jsapi';
 
                 return sums;
             },
-            changeMonth() {
+            loadMonthData() {
                 //改变月份
                 this.getList();
                 this.assignToProject();
                 this.getMonths()
             },
-            // 批量导入人员
+            // 批量导入人员薪资
             importFinance(item) {
                 //首先判断文件类型
                 let str = item.file.name.split(".");
@@ -1434,7 +1420,7 @@ import { error } from 'dingtalk-jsapi';
                                     message: this.$t('waiforverification'),
                                     type: "warning"
                                 });
-                                this.getMonths();
+                                this.loadMonthData();
                             } else {
                                 this.$message({
                                     message: this.$t('other.importSuccess'),
@@ -1758,11 +1744,10 @@ import { error } from 'dingtalk-jsapi';
             };
             
             this.getCustomColumn();
-            this.getList();
             // this.getProjects();
             this.addreviewer();
             this.arrter()
-            this.getMonths()
+            this.loadMonthData()
             this.scrollFunction()
         },
         updated() {

+ 75 - 36
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -136,7 +136,7 @@
                     </el-form-item>
 
                     <el-form-item style="float:right;" v-if="user.dingdingUserid != null && permissions.structureImport">
-                        <el-link type="primary" :underline="false" @click="syncWithCorpDingding">{{ $t('synchronizetheaddressbook') }}</el-link>
+                        <el-link type="primary" :underline="false" @click="showCorpDDSyncDialog">{{ $t('synchronizetheaddressbook') }}</el-link>
                     </el-form-item>
 
                     <!-- <el-form-item style="float:right;" v-if="user.dingdingUserid == null && permissions.structureImport">
@@ -786,6 +786,16 @@
                 <el-button type="primary" :underline="false" :loading="importingData" :disabled="!canSync" @click="startCorpWxImport">{{ $t('startsynchronization') }}</el-button>
             </p>
         </el-dialog>
+        <el-dialog title="同步钉钉通讯录" v-if="showSyncDDDialog" :visible.sync="showSyncDDDialog" customClass="customWidth" width="500px">
+            <p>{{ $t('areyousuretosynchronize') }} 
+            </p>
+            <p>
+              <el-checkbox v-model="isSyncContact" @change="setSyncContactDD()">人员所在部门与钉钉通讯录保持一致</el-checkbox>
+            </p>
+            <p style="display: flex;justify-content: center;padding-bottom:1em;">
+                <el-button type="primary" :underline="false" :loading="importingData"  @click="syncWithCorpDingding">{{ $t('startsynchronization') }}</el-button>
+            </p>
+        </el-dialog>
         <el-dialog :title="$t('correlationresults')" v-if="syncMembByCardTimeResultGialog" :visible.sync="syncMembByCardTimeResultGialog" customClass="customWidth" width="500px">
             <p style="padding-bottom:30px;">
             {{syncMembByCardTimeMsg}}
@@ -890,6 +900,8 @@ export default {
   },
   data() {
     return {
+      isSyncContact: false,
+      showSyncDDDialog: false,
       transferActiveDialogFlag:false,
       transferActive:{
         handoverId:null,
@@ -1435,54 +1447,81 @@ export default {
         }
       );
     },
-    // 从钉钉同步通讯录
-    syncWithCorpDingding() {
-      this.$confirm(
-        this.$t('areyousuretosynchronize '),
-        this.$t('other.prompts'),
-        {
-          confirmButtonText: this.$t('btn.determine'),
-          cancelButtonText: this.$t('btn.cancel'),
-          type: "warning",
-        }
-      )
-        .then(() => {
-          this.listLoading = true;
-          this.http.post(
-            "/company/syncCorpMembs",
+    
+    showCorpDDSyncDialog() {
+      this.showSyncDDDialog = true;
+      this.http.post(
+            "/company-dingding/getSyncContact",
             {},
             (res) => {
-              this.listLoading = false;
               if (res.code == "ok") {
-                this.$message({
-                  message: res.data,
-                  type: "success",
-                });
-                this.getDepartment();
-                this.getUser();
-                this.getUsers();
-              } else {
-                this.$message({
-                  message: res.msg,
-                  type: "error",
-                });
-              }
+                  this.isSyncContact = (res.data ==1?true: false);
+              } 
             },
             (err) => {
-              this.listLoading = false;
               this.$message({
                 message: err,
                 type: "error",
               });
             }
           );
-        })
-        .catch(() => {
+    },
+    setSyncContactDD() {
+      this.http.post(
+        "/company-dingding/setSyncContact",
+        {isSync: this.isSyncContact?1:0},
+        (res) => {
+          if (res.code == "ok") {
+            
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error",
+            });
+          }
+        },
+        (err) => {
           this.$message({
-            message: this.$t('operationcancelled'),
-            type: "info",
+            message: err,
+            type: "error",
           });
-        });
+        }
+      );
+    },
+    // 从钉钉同步通讯录
+    syncWithCorpDingding() {
+      this.importingData = true;
+      this.listLoading = true;
+      this.http.post(
+        "/company/syncCorpMembs",
+        {},
+        (res) => {
+          this.listLoading = false;
+          this.importingData = false;
+          if (res.code == "ok") {
+            this.showSyncDDDialog = false;
+            this.$message({
+              message: res.data,
+              type: "success",
+            });
+            this.getDepartment();
+            this.getUser();
+            this.getUsers();
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error",
+            });
+          }
+        },
+        (err) => {
+          this.listLoading = false;
+          this.$message({
+            message: err,
+            type: "error",
+          });
+        }
+      );
     },
     test() {
       this.getCustomConfigList();

+ 13 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/weekEdit.vue

@@ -291,7 +291,7 @@
                         icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 5px;"> 添加工时  </span></van-tag>
                     </div>
                     
-                    <div class="overtime" v-if="!user.timeType.lockWorktime">
+                    <div class="overtime" v-if="((user.timeType.fillOvertime || (isWeekend && user.timeType.lockWorktime != 1)) || (isCorpWX&&canEdit))">
                         <div class="overTimeClas">
                             <van-checkbox  v-model="item.isOvertime" style="width: 4.3rem;">加班</van-checkbox>
                             <van-field v-model="item.overtimeHours" type="number" :disabled="item.isOvertime==null||item.isOvertime==0"
@@ -469,6 +469,7 @@
                 workTimeText: false,
 
                 reportBasecostList: [],
+                isWeekend: false,
 
                 auditorShow: false,
                 auditor: {
@@ -1176,6 +1177,17 @@
 
             // 获取日报
             getReport() {
+                this.isWeekend = false;
+                let weekday = new Date(this.form.createDate).getDay()
+                if(this.user.companyId == 817){
+                    if(weekday == 0){
+                        this.isWeekend = true
+                    }
+                }else{
+                    if(weekday == 0 || weekday == 6){
+                        this.isWeekend = true
+                    }
+                }
                 const toast = this.$toast.loading({
                     forbidClick: true,
                     duration: 0