Lijy hace 5 meses
padre
commit
5d89d7e868
Se han modificado 13 ficheros con 511 adiciones y 295 borrados
  1. 8 9
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java
  2. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java
  3. 6 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanTask.java
  4. 16 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Contract.java
  6. 3 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExpenseSheetService.java
  7. 21 18
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractBonusDetailServiceImpl.java
  8. 11 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  9. 116 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java
  10. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceExcludeProjectServiceImpl.java
  11. 278 238
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/FinanceServiceImpl.java
  12. 36 25
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/FileZipUtil.java
  13. 10 0
      fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/contractManagement.vue

+ 8 - 9
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/BusinessOpportunityController.java

@@ -15,7 +15,6 @@ import com.management.platform.service.SysFunctionService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.service.impl.ExcelExportServiceImpl;
 import com.management.platform.util.HttpRespMsg;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -274,14 +273,14 @@ public class BusinessOpportunityController {
     public Object claim(BusinessOpportunity bo, HttpServletRequest request) {
         User user = userMapper.selectById(request.getHeader("Token"));
         HttpRespMsg msg = new HttpRespMsg();
-        String[] strings = bo.getIds().split(",");
-        for (String id : strings) {
-            BusinessOpportunity opportunity = boMapper.selectById(id);
-            if (StringUtils.isEmpty(opportunity.getInchargerId())){
-                msg.setError("商机:"+opportunity.getName()+"未被认领不能转移");
-                return msg;
-            }
-        }
+//        String[] strings = bo.getIds().split(",");
+//        for (String id : strings) {
+//            BusinessOpportunity opportunity = boMapper.selectById(id);
+//            if (StringUtils.isEmpty(opportunity.getInchargerId())){
+//                msg.setError("商机:"+opportunity.getName()+"未被认领不能转移");
+//                return msg;
+//            }
+//        }
         bOservice.getAndTransfer(bo, user);
         return msg;
     }

+ 2 - 2
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/VisitPlanController.java

@@ -110,12 +110,12 @@ public class VisitPlanController {
      * 获取分页数据
      * @param pageIndex
      * @param pageSize
-     * @param calenderTime
+     * @param calenderDate
      * @param request
      * @return
      */
     @PostMapping("/getVisitPlanList")
-    public HttpRespMsg getVisitPlan(@RequestParam(value = "pageIndex",required = false) Integer pageIndex
+    public HttpRespMsg getVisitPlanList(@RequestParam(value = "pageIndex",required = false) Integer pageIndex
             , @RequestParam(value = "pageSize",required = false) Integer pageSize
             ,@RequestParam("calenderDate")String calenderDate
             ,HttpServletRequest request){

+ 6 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/time/VisitPlanTask.java

@@ -53,8 +53,14 @@ public class VisitPlanTask {
                 Integer companyId = entry.getKey();
                 WxCorpInfo wxCorpInfo =companyWXCorpMap.getOrDefault(companyId,null);
                 List<VisitPlan> planList = entry.getValue();
+                if(CollectionUtils.isEmpty(planList)){
+                    continue;
+                }
                 List<String> wxIds = planList.stream().filter(t -> StringUtils.isNotBlank(t.getCorpwxUserid())).map(VisitPlan::getCorpwxUserid)
                         .collect(Collectors.toList());
+                if(CollectionUtils.isEmpty(wxIds)){
+                    continue;
+                }
                 String join = StringUtils.join(wxIds, '|');
                 if (wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&StringUtils.isNotBlank(join)){
                     // getCorpwxUserid  以 | 隔开 可分割开放

+ 16 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -21,6 +21,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -94,8 +95,21 @@ public class ExpenseSheetController {
      * 导出
      */
     @RequestMapping("/export")
-    public void getExport(HttpServletResponse response) throws Exception {
-        FileZipUtil.exportZip(response,uploadPath , "报销凭证压缩包", ".zip");
+    public void getExport(ExpenseSheet sheet,Integer sendState,Integer projectId,String startDate, String endDate,HttpServletResponse response) throws Exception {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "查看全部报销单");
+        if (functionList.size() == 0) {
+            //普通员工只能看自己的
+            if (sheet.getStatus() == null) {
+                sheet.setOwnerId(user.getId());
+            }
+        }
+        sheet.setCompanyId(user.getCompanyId());
+        List<String> fileNames= expenseSheetService.queryExportFileZipList(sheet,projectId, startDate, endDate);
+        if (!fileNames.isEmpty()){
+            FileZipUtil.exportZip(response,uploadPath ,fileNames, "报销凭证压缩包", ".zip");
+        }else return;
     }
 
 

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

@@ -178,6 +178,9 @@ public class Contract extends Model<Contract> {
     @TableField(exist = false)
     private String secTypeName;
 
+    @TableField(exist = false)
+    private String projectName;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -6,6 +6,7 @@ import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -38,4 +39,6 @@ public interface ExpenseSheetService extends IService<ExpenseSheet> {
     HttpRespMsg approveSingleProject(Integer id);
 
     HttpRespMsg denySingleProject(Integer id, String denyReason);
+
+    List<String> queryExportFileZipList(ExpenseSheet sheet, Integer projectId, String startDate, String endDate);
 }

+ 21 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractBonusDetailServiceImpl.java

@@ -134,7 +134,7 @@ public class ContractBonusDetailServiceImpl extends ServiceImpl<ContractBonusDet
             try {
                 WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",
                         user.getCompanyId()));
-                if(wxCorpInfo != null&&wxCorpInfo.getSaasSyncContact() == 1){
+                if(wxCorpInfo != null&&wxCorpInfo.getSaasSyncContact() == 1&&CollectionUtils.isNotEmpty(checkEmptyWxUserNameList)){
                     respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, checkEmptyWxUserNameList,null);
                     if(respMsg.code.equals("0")){
                         httpRespMsg.setError("["+String.valueOf(respMsg.data)+"]在系统中为重名人员,请完善工号信息!");
@@ -144,26 +144,29 @@ public class ContractBonusDetailServiceImpl extends ServiceImpl<ContractBonusDet
                     isWxCheck = true;
                 }else{
                     //根据名称判断,不能有重名
-                    List<User> emptyUsers = userMapper.selectList(new LambdaQueryWrapper<User>()
-                            .select(User::getId, User::getCompanyId, User::getName, User::getJobNumber, User::getPlate1, User::getCorpwxUserid)
-                            .eq(User::getCompanyId, user.getCompanyId())
-                            .eq(User::getIsActive, 1)
-                            .in(User::getName, checkEmptyWxUserNameList));
-                    for (ImportBonusTemplateVO templateVO : emptyJNList) {
-                        long count = emptyUsers.stream().filter(t -> t.getName().equals(templateVO.getUserName())).count();
-                        if(count == 0){
-                            httpRespMsg.setError("员工:"+templateVO.getUserName()+" 无对应记录或未激活,请重新填写");
-                            return httpRespMsg;
-                        }else if( count > 1){
-                            httpRespMsg.setError("["+templateVO.getUserName()+"]在系统中为重名人员,请完善工号信息!");
-                            return httpRespMsg;
-                        }else{
-                            Optional<User> first = emptyUsers.stream().filter(t -> t.getName().equals(templateVO.getUserName())).findFirst();
-                            if(first.isPresent()){
-                                emptyJNRespList.add(first.get());
+                    if(CollectionUtils.isNotEmpty(checkEmptyWxUserNameList)){
+                        List<User> emptyUsers = userMapper.selectList(new LambdaQueryWrapper<User>()
+                                .select(User::getId, User::getCompanyId, User::getName, User::getJobNumber, User::getPlate1, User::getCorpwxUserid)
+                                .eq(User::getCompanyId, user.getCompanyId())
+                                .eq(User::getIsActive, 1)
+                                .in(User::getName, checkEmptyWxUserNameList));
+                        for (ImportBonusTemplateVO templateVO : emptyJNList) {
+                            long count = emptyUsers.stream().filter(t -> t.getName().equals(templateVO.getUserName())).count();
+                            if(count == 0){
+                                httpRespMsg.setError("员工:"+templateVO.getUserName()+" 无对应记录或未激活,请重新填写");
+                                return httpRespMsg;
+                            }else if( count > 1){
+                                httpRespMsg.setError("["+templateVO.getUserName()+"]在系统中为重名人员,请完善工号信息!");
+                                return httpRespMsg;
+                            }else{
+                                Optional<User> first = emptyUsers.stream().filter(t -> t.getName().equals(templateVO.getUserName())).findFirst();
+                                if(first.isPresent()){
+                                    emptyJNRespList.add(first.get());
+                                }
                             }
                         }
                     }
+
                 }
             } catch (IOException e){
                 e.printStackTrace();

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

@@ -88,6 +88,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     private ContractTypeSecMapper contractTypeSecMapper;
     @Autowired
     private ContractPayCustomizedMapper contractPayCustomizedMapper;
+    @Autowired
+    private ProjectMapper projectMapper;
 
     /**
      * 分页查询合同
@@ -168,6 +170,12 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             List<Map<String, Object>> contractLogs = contractLogMapper.selectMsg(user.getCompanyId());
             List<ContractCustom> customList = contractCustomMapper.selectList(new QueryWrapper<ContractCustom>().in("contract_id", contractCollect));
             List<ContractTypeSec> secTypeList = contractTypeSecMapper.selectList(new QueryWrapper<ContractTypeSec>().eq("company_id", user.getCompanyId()));
+            //关联项目
+            List<Project> projectList = new ArrayList<>();
+            if (contracts.size() > 0) {
+                projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id, project_name").in("id", contracts.stream().map(Contract::getProjectId).collect(Collectors.toList())));
+            }
+
             for (Contract contract : contracts) {
                 ContractPageVO contractPageVO = new ContractPageVO();
                 List<ContractDocument> files = new ArrayList<>();
@@ -190,6 +198,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 contractPageVO.setRemarks(contract.getRemarks());
                 contractPageVO.setAmounts(contract.getAmounts());
                 contractPageVO.setProjectId(contract.getProjectId());
+                if (contract.getProjectId() != null) {
+                    projectList.stream().filter(project -> project.getId().equals(contract.getProjectId())).findFirst().ifPresent(project -> contractPageVO.setProjectName(project.getProjectName()));
+                }
                 contractPageVO.setPayment(contract.getPayment());
                 contractPageVO.setNextPaymentDate(contract.getNextPaymentDate());
                 contractPageVO.setNextPaymentAmount(contract.getNextPaymentAmount());

+ 116 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -1335,4 +1335,120 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         saveNotifyToApplier(sheet, user);
         return new HttpRespMsg();
     }
+
+    @Override
+    public List<String> queryExportFileZipList(ExpenseSheet sheet, Integer projectId, String startDate, String endDate) {
+        QueryWrapper<ExpenseSheet> queryWrapper = new QueryWrapper<ExpenseSheet>();
+        //当前用户
+        String token = request.getHeader("TOKEN");
+        queryWrapper.eq("company_id", sheet.getCompanyId()).orderByDesc("id");
+        ExpenseAuditSetting expenseAuditSetting = expenseAuditSettingMapper.selectById(sheet.getCompanyId());
+        ArrayList<String> fileNameList = new ArrayList<>();
+        if (!StringUtils.isEmpty(sheet.getCode())) {
+            queryWrapper.eq("code", sheet.getCode());
+        }
+        //增加状态
+        if (sheet.getStatus() != null) {
+            queryWrapper.eq("status", sheet.getStatus());
+        }
+        if(sheet.getSendState()!=null){
+            queryWrapper.eq("send_state",sheet.getSendState());
+        }
+
+        if (expenseAuditSetting == null || expenseAuditSetting.getAuditType() == 0) {
+            if (sheet.getStatus() != null &&  sheet.getStatus() == 1) {
+                //待审核列表,检查是否有权限
+                User user = userMapper.selectById(token);
+                List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "费用审核");
+                if (functionList.size() == 0) {
+                    //无权查看待审核
+                    queryWrapper.eq("id", -1);
+                }
+            } else {
+                if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+                    queryWrapper.eq("owner_id", sheet.getOwnerId());
+                }
+            }
+        } else if(expenseAuditSetting.getAuditType() == 1){
+            //增加按项目经理审核模式下,项目经理可以查看相关费用报销单的条件
+            if (sheet.getStatus() != null) {
+                //取待审核的
+                //项目经理审核模式下,只能查看自己项目的费用报销单
+                List<Integer> projectIds = projectMapper.selectList(new QueryWrapper<Project>().eq("incharger_id", token)).stream().map(Project::getId).collect(Collectors.toList());
+                System.out.println("项目经理的项目id"+projectIds);
+                if (projectIds.size() > 0) {
+                    List<Integer> expenseIds = expenseItemMapper.selectList(new QueryWrapper<ExpenseItem>().in("project_id", projectIds)).stream().map(ExpenseItem::getExpenseId).distinct().collect(Collectors.toList());
+                    System.out.println("项目经理的项目的费用报销单id"+expenseIds);
+                    queryWrapper.in("id", expenseIds);
+                } else {
+                    //没有项目的项目经理,不显示任何数据
+                    queryWrapper.eq("id", -1);
+                }
+                //按选择的人员过滤
+                if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+                    queryWrapper.eq("owner_id", sheet.getOwnerId());
+                }
+            } else {
+                //按人员过滤
+                if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+                    queryWrapper.eq("owner_id", sheet.getOwnerId());
+                }
+            }
+        }else if(expenseAuditSetting.getAuditType() == 2){
+            if (sheet.getStatus() != null) {
+                //增加多层审核人审核模式 过滤第一或者第二审核人为当前用户的数据
+                queryWrapper.and(wrapper->wrapper.and(wr->wr.eq("first_checker_id",token).eq("review_process",0)).or(wr->wr.eq("second_checker_id",token).eq("review_process",1)));
+                if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+                    queryWrapper.eq("owner_id", sheet.getOwnerId());
+                }
+            }else {
+                //按人员过滤
+                if (!StringUtils.isEmpty(sheet.getOwnerId())) {
+                    queryWrapper.eq("owner_id", sheet.getOwnerId());
+                }
+            }
+        }
+
+        if (!StringUtils.isEmpty(sheet.getType())) {
+            queryWrapper.eq("type", sheet.getType());
+        }
+        if (!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(endDate)) {
+            queryWrapper.between("create_date", startDate, endDate);
+        }
+        if (projectId!=null){
+            QueryWrapper<ExpenseItem> q = new QueryWrapper<ExpenseItem>();
+            q.eq("project_id",projectId);
+            List<ExpenseItem> expenseItems = expenseItemMapper.selectList(q);
+            if (expenseItems.size()==0){
+                return new ArrayList<String>();
+            }else {
+                List<Integer> expenseIds = expenseItems.stream().map(ExpenseItem::getExpenseId).collect(Collectors.toList());
+                queryWrapper.in("id",expenseIds);
+                return getStrings(queryWrapper);
+            }
+        }else {
+            return getStrings(queryWrapper);
+        }
+    }
+
+    private ArrayList<String> getStrings(QueryWrapper<ExpenseSheet> queryWrapper) {
+        List<ExpenseSheet> records= expenseSheetMapper.selectList(queryWrapper);
+        ArrayList<String> fileNames = new ArrayList<>();
+        if (!records.isEmpty()){
+            List<Integer> sheetIdList = records.stream().map(ExpenseSheet::getId).distinct().collect(Collectors.toList());
+            if (!sheetIdList.isEmpty()){
+                QueryWrapper<ExpenseItem> itemQueryWrapper = new QueryWrapper<ExpenseItem>().in("expense_id", sheetIdList);
+                List<ExpenseItem> items = expenseItemMapper.selectList(itemQueryWrapper);
+                if (!items.isEmpty()){
+                    for (ExpenseItem item : items) {
+                        if (org.apache.commons.lang3.StringUtils.isNotEmpty(item.getPic())){
+                            String[] picNames = item.getPic().split(",");
+                            fileNames.addAll(Arrays.asList(picNames));
+                        }
+                    }
+                }
+            }
+        }
+        return fileNames;
+    }
 }

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

@@ -63,7 +63,7 @@ public class FinanceExcludeProjectServiceImpl extends ServiceImpl<FinanceExclude
 
         List<FinanceExcludeProject> resList = financeExcludeProjectMapper
                 .selectList(new LambdaQueryWrapper<FinanceExcludeProject>()
-                        .eq(FinanceExcludeProject::getProjectId,user.getCompanyId())
+                        .eq(FinanceExcludeProject::getCompanyId,user.getCompanyId())
                         .eq(FinanceExcludeProject::getUseYM,useYM));
         if(projectCount == resList.size()){
             map.put("isAll",1);

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

@@ -11,9 +11,9 @@ import com.management.platform.service.*;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
-import com.taobao.api.internal.util.StringUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -184,8 +184,12 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
             //获取人员该月份填写的日报的总时长
             List<Map<String, Object>> userTimeList = null;
             if (syncUserCost || syncHistoryReport) {
-//                userTimeList = reportMapper.getUserWorkingTimeByRange(companyId, startStr, endStr);
                 userTimeList = reportMapper.getUserWorkingTimeByRangeWithExclude(companyId, yearMonth,startStr, endStr);
+                if (userTimeList.size() == 0) {
+                    msg.setError("当月没有相关项目的日报数据,请检查是否设置了不参与项目");
+                    return msg;
+                }
+
             }
 
             //设置财务核算薪资模板配置
@@ -384,6 +388,7 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 }
 
                 if (first != null && first.isPresent()) {
+                    System.out.println("匹配到的人员:"+first.get().getName());
                     finance.setUserId(first.get().getId());
                     BigDecimal total = new BigDecimal(0);
                     if (salaryCell != null) {
@@ -512,14 +517,22 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
                             localUser.setCost(total.divide(db, 6, BigDecimal.ROUND_HALF_UP));
                         } else {
+                            boolean find = false;
                             for (int i=0;i<userTimeList.size(); i++) {
                                 Map<String, Object> map = userTimeList.get(i);
                                 if (map.get("creatorId").equals(finance.getUserId())) {
+                                    find = true;
                                     double time = (Double)map.get("workingTime");
                                     localUser.setCost(total.divide(new BigDecimal(time), 6, BigDecimal.ROUND_HALF_UP));
                                     break;
                                 }
                             }
+                            if (!find) {
+                                //没有找到对应的工时,按标准工时来
+                                System.out.println("没有找到对应的工时,按标准工时来, userId="+finance.getUserId()+", jobNumber="+finance.getJobNumber());
+                                BigDecimal db = timeType.getMonthDays().multiply(new BigDecimal(timeType.getAllday()));
+                                localUser.setCost(total.divide(db, 6, BigDecimal.ROUND_HALF_UP));
+                            }
                         }
 
                         updateUserList.add(localUser);
@@ -696,22 +709,45 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                 headList.add(MessageUtils.message("entry.projectType"));
             }
             FinanceFixedcolname fixedItem = financeFixedcolnameService.getFixed(companyId);
-            headList.add(fixedItem.getMonthCost()+"(元)");
-            sheetNameList.add(fixedItem.getMonthCost()+"分摊表");
-            headList.add(fixedItem.getBonus()+"(元)");
-            sheetNameList.add(fixedItem.getBonus()+"分摊表");
-            headList.add(fixedItem.getAllowance()+"(元)");
-            sheetNameList.add(fixedItem.getAllowance()+"分摊表");
-            headList.add(fixedItem.getInsuranceOld()+"(元)");
-            sheetNameList.add(fixedItem.getInsuranceOld()+"分摊表");
-            headList.add(fixedItem.getInsuranceMedical()+"(元)");
-            sheetNameList.add(fixedItem.getInsuranceMedical()+"分摊表");
-            headList.add(fixedItem.getInsuranceLosejob()+"(元)");
-            sheetNameList.add(fixedItem.getInsuranceLosejob()+"分摊表");
-            headList.add(fixedItem.getInsuranceInjury()+"(元)");
-            sheetNameList.add(fixedItem.getInsuranceInjury()+"分摊表");
-            headList.add(fixedItem.getHouseFund()+"(元)");
-            sheetNameList.add(fixedItem.getHouseFund()+"分摊表");
+            if(StringUtils.isNotBlank(fixedItem.getMonthCost())){
+                headList.add(fixedItem.getMonthCost()+"(元)");
+                sheetNameList.add(fixedItem.getMonthCost()+"分摊表");
+            }
+
+            if(StringUtils.isNotBlank(fixedItem.getBonus())){
+                headList.add(fixedItem.getBonus()+"(元)");
+                sheetNameList.add(fixedItem.getBonus()+"分摊表");
+            }
+
+
+            if(StringUtils.isNotBlank(fixedItem.getAllowance())){
+                headList.add(fixedItem.getAllowance()+"(元)");
+                sheetNameList.add(fixedItem.getAllowance()+"分摊表");
+            }
+
+            if(StringUtils.isNotBlank(fixedItem.getInsuranceOld())){
+                headList.add(fixedItem.getInsuranceOld()+"(元)");
+                sheetNameList.add(fixedItem.getInsuranceOld()+"分摊表");
+            }
+
+            if(StringUtils.isNotBlank(fixedItem.getInsuranceMedical())){
+                headList.add(fixedItem.getInsuranceMedical()+"(元)");
+                sheetNameList.add(fixedItem.getInsuranceMedical()+"分摊表");
+            }
+
+            if(StringUtils.isNotBlank(fixedItem.getInsuranceLosejob())){
+                headList.add(fixedItem.getInsuranceLosejob()+"(元)");
+                sheetNameList.add(fixedItem.getInsuranceLosejob()+"分摊表");
+            }
+            if(StringUtils.isNotBlank(fixedItem.getInsuranceInjury())){
+                headList.add(fixedItem.getInsuranceInjury()+"(元)");
+                sheetNameList.add(fixedItem.getInsuranceInjury()+"分摊表");
+            }
+            if(StringUtils.isNotBlank(fixedItem.getHouseFund())){
+                headList.add(fixedItem.getHouseFund()+"(元)");
+                sheetNameList.add(fixedItem.getHouseFund()+"分摊表");
+            }
+
 //            headList.add("其他(元)");
             for (FinanceTblcuscol col : cusColList) {
                 headList.add(col.getFieldName());
@@ -1185,229 +1221,231 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                     rowData.add(p.cost.toPlainString());
                     allList.add(rowData);
 
-                    //获取成员
-                    for (Map<String, Object> membMap : projectTimeList) {
+                    if(0 != onlyTotal){
+                        //获取成员
+                        for (Map<String, Object> membMap : projectTimeList) {
 //                        if (membMap.get("project").equals(p.project)) {
-                        Integer projectId = ((Long) membMap.get("projectId")).intValue();
-                        //修改为按照projectId匹配
-                        if (projectId.equals(p.projectId)) {
-                            //匹配到项目了
-                            List<String> membRowData = new ArrayList<String>();
-                            membRowData.add(p.projectCode);
-                            membRowData.add(p.project);
-                            Double workingTime = (Double) membMap.get("workingTime");
-                            String creatorId = (String) membMap.get("creatorId");
-                            User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
-                            Optional<Finance> first = finances.stream().filter(f -> f.getUserId().equals(creatorId)).findFirst();
-                            if (!first.isPresent()) {
-                                //logger.info("用户["+us.getName()+"]在财务报表中不存在,请重新导入");
-                                logger.info(MessageUtils.message("report.userNull",us.getName()));
-                                continue;
-                            }
-                            Finance userFinance = first.get();
-
-                            BigDecimal cost = userFinance.getTotalCost().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal salary = userFinance.getMonthCost().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal bonus = userFinance.getBonus().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal allowance = userFinance.getAllowance().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal old = userFinance.getInsuranceOld().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal medical = userFinance.getInsuranceMedical().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal loseJob = userFinance.getInsuranceLosejob().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal injury = userFinance.getInsuranceInjury().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal house = userFinance.getHouseFund().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field1 = userFinance.getCustomField1() == null? new BigDecimal(0):userFinance.getCustomField1().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field2 = userFinance.getCustomField2() == null? new BigDecimal(0):userFinance.getCustomField2().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field3 = userFinance.getCustomField3() == null? new BigDecimal(0):userFinance.getCustomField3().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field4 = userFinance.getCustomField4() == null? new BigDecimal(0):userFinance.getCustomField4().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field5 = userFinance.getCustomField5() == null? new BigDecimal(0):userFinance.getCustomField5().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field6 = userFinance.getCustomField6() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            BigDecimal field7 = userFinance.getCustomField7() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
-                            //增加部门
-                            Optional<Department> findDept = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
-                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
-                                if (findDept.isPresent()) {
-                                    membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
-                                } else {
-                                    membRowData.add("");
+                            Integer projectId = ((Long) membMap.get("projectId")).intValue();
+                            //修改为按照projectId匹配
+                            if (projectId.equals(p.projectId)) {
+                                //匹配到项目了
+                                List<String> membRowData = new ArrayList<String>();
+                                membRowData.add(p.projectCode);
+                                membRowData.add(p.project);
+                                Double workingTime = (Double) membMap.get("workingTime");
+                                String creatorId = (String) membMap.get("creatorId");
+                                User us = userList.stream().filter(u->u.getId().equals(creatorId)).findFirst().get();
+                                Optional<Finance> first = finances.stream().filter(f -> f.getUserId().equals(creatorId)).findFirst();
+                                if (!first.isPresent()) {
+                                    //logger.info("用户["+us.getName()+"]在财务报表中不存在,请重新导入");
+                                    logger.info(MessageUtils.message("report.userNull",us.getName()));
+                                    continue;
                                 }
-                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
-                                membRowData.add("$userName="+us.getName()+"$");
-                                if (findDept.isPresent()) {
-                                    membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
-                                } else {
-                                    membRowData.add("");
+                                Finance userFinance = first.get();
+
+                                BigDecimal cost = userFinance.getTotalCost().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal salary = userFinance.getMonthCost().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal bonus = userFinance.getBonus().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal allowance = userFinance.getAllowance().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal old = userFinance.getInsuranceOld().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal medical = userFinance.getInsuranceMedical().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal loseJob = userFinance.getInsuranceLosejob().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal injury = userFinance.getInsuranceInjury().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal house = userFinance.getHouseFund().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field1 = userFinance.getCustomField1() == null? new BigDecimal(0):userFinance.getCustomField1().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field2 = userFinance.getCustomField2() == null? new BigDecimal(0):userFinance.getCustomField2().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field3 = userFinance.getCustomField3() == null? new BigDecimal(0):userFinance.getCustomField3().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field4 = userFinance.getCustomField4() == null? new BigDecimal(0):userFinance.getCustomField4().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field5 = userFinance.getCustomField5() == null? new BigDecimal(0):userFinance.getCustomField5().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field6 = userFinance.getCustomField6() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                BigDecimal field7 = userFinance.getCustomField7() == null? new BigDecimal(0):userFinance.getCustomField6().multiply(new BigDecimal(workingTime)).divide(userTime.get(creatorId).workingTime, 6, BigDecimal.ROUND_HALF_UP);
+                                //增加部门
+                                Optional<Department> findDept = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
+                                if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                    membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
+                                    if (findDept.isPresent()) {
+                                        membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
+                                    } else {
+                                        membRowData.add("");
+                                    }
+                                }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                    membRowData.add("$userName="+us.getName()+"$");
+                                    if (findDept.isPresent()) {
+                                        membRowData.add("$departmentName="+findDept.get().getDepartmentName()+"$");
+                                    } else {
+                                        membRowData.add("");
+                                    }
+                                }else {
+                                    membRowData.add(us.getName());
+                                    if (findDept.isPresent()) {
+                                        membRowData.add(findDept.get().getDepartmentName());
+                                    } else {
+                                        membRowData.add("");
+                                    }
                                 }
-                            }else {
-                                membRowData.add(us.getName());
-                                if (findDept.isPresent()) {
-                                    membRowData.add(findDept.get().getDepartmentName());
-                                } else {
-                                    membRowData.add("");
+                                for (int i = 0; i < userCustoms.size(); i++) {
+                                    switch (i){
+                                        case 0:
+                                            membRowData.add(us.getPlate1()==null?"":us.getPlate1());
+                                            break;
+                                        case 1:
+                                            membRowData.add(us.getPlate2()==null?"":us.getPlate2());
+                                            break;
+                                        case 2:
+                                            membRowData.add(us.getPlate3()==null?"":us.getPlate3());
+                                            break;
+                                        case 3:
+                                            membRowData.add(us.getPlate4()==null?"":us.getPlate4());
+                                            break;
+                                        case 4:
+                                            membRowData.add(us.getPlate5()==null?"":us.getPlate5());
+                                            break;
+                                    }
                                 }
-                            }
-                            for (int i = 0; i < userCustoms.size(); i++) {
-                                switch (i){
-                                    case 0:
-                                        membRowData.add(us.getPlate1()==null?"":us.getPlate1());
-                                        break;
-                                    case 1:
-                                        membRowData.add(us.getPlate2()==null?"":us.getPlate2());
-                                        break;
-                                    case 2:
-                                        membRowData.add(us.getPlate3()==null?"":us.getPlate3());
-                                        break;
-                                    case 3:
-                                        membRowData.add(us.getPlate4()==null?"":us.getPlate4());
-                                        break;
-                                    case 4:
-                                        membRowData.add(us.getPlate5()==null?"":us.getPlate5());
-                                        break;
+                                membRowData.add(workTimeFormatter.format(workingTime));
+                                membRowData.add(salary.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(bonus.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(allowance.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(old.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(medical.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(loseJob.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(injury.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                membRowData.add(house.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                //自定义字段
+                                if (cusColList.size() > 0) {
+                                    membRowData.add(field1.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
                                 }
+                                if (cusColList.size() > 1) {
+                                    membRowData.add(field2.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                if (cusColList.size() > 2) {
+                                    membRowData.add(field3.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                if (cusColList.size() > 3) {
+                                    membRowData.add(field4.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                if (cusColList.size() > 4) {
+                                    membRowData.add(field5.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                if (cusColList.size() > 5) {
+                                    membRowData.add(field6.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                if (cusColList.size() > 6) {
+                                    membRowData.add(field7.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                }
+                                membRowData.add(cost.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                allList.add(membRowData);
                             }
-                            membRowData.add(workTimeFormatter.format(workingTime));
-                            membRowData.add(salary.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(bonus.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(allowance.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(old.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(medical.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(loseJob.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(injury.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            membRowData.add(house.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            //自定义字段
-                            if (cusColList.size() > 0) {
-                                membRowData.add(field1.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 1) {
-                                membRowData.add(field2.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 2) {
-                                membRowData.add(field3.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 3) {
-                                membRowData.add(field4.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 4) {
-                                membRowData.add(field5.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 5) {
-                                membRowData.add(field6.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            if (cusColList.size() > 6) {
-                                membRowData.add(field7.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            }
-                            membRowData.add(cost.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                            allList.add(membRowData);
                         }
-                    }
 
-                    //无项目人员成本
-                    if (assignNoProUser != null && assignNoProUser) {
-                        for (Finance npu : noProjectUser) {
-                            List<String> membRowData = new ArrayList<String>();
-                            membRowData.add(p.projectCode);
-                            membRowData.add(p.project);
-                            Double workingTime = new Double(0);
-                            Finance userFinance = npu;
-                            Optional<Map> op = noPUserDataList.stream().filter(map->((Integer)map.get("projectId")).equals(p.projectId) && ((String)map.get("creatorId")).equals(npu.getUserId())).findFirst();
-                            if (op.isPresent()) {
-                                Map percentMap = op.get();
-                                double percent = (double)percentMap.get("percent");
-                                if (percent > 0) {
-                                    //各项收入按比例计算,累加到当前项目上
-                                    Finance newFinance = Finance.getByPercent(npu, percent);
-
-                                    BigDecimal cost = newFinance.getTotalCost();
-                                    BigDecimal salary = newFinance.getMonthCost();
-                                    BigDecimal bonus = newFinance.getBonus();
-                                    BigDecimal allowance = newFinance.getAllowance();
-                                    BigDecimal old = newFinance.getInsuranceOld();
-                                    BigDecimal medical = newFinance.getInsuranceMedical();
-                                    BigDecimal loseJob = newFinance.getInsuranceLosejob();
-                                    BigDecimal injury = newFinance.getInsuranceInjury();
-                                    BigDecimal house = newFinance.getHouseFund();
-                                    BigDecimal field1 = newFinance.getCustomField1() == null? new BigDecimal(0):newFinance.getCustomField1();
-                                    BigDecimal field2 = newFinance.getCustomField2() == null? new BigDecimal(0):newFinance.getCustomField2();
-                                    BigDecimal field3 = newFinance.getCustomField3() == null? new BigDecimal(0):newFinance.getCustomField3();
-                                    BigDecimal field4 = newFinance.getCustomField4() == null? new BigDecimal(0):newFinance.getCustomField4();
-                                    BigDecimal field5 = newFinance.getCustomField5() == null? new BigDecimal(0):newFinance.getCustomField5();
-                                    BigDecimal field6 = newFinance.getCustomField6() == null? new BigDecimal(0):newFinance.getCustomField6();
-                                    BigDecimal field7 = newFinance.getCustomField7() == null? new BigDecimal(0):newFinance.getCustomField7();
-                                    User us = userList.stream().filter(u->u.getId().equals(npu.getUserId())).findFirst().get();
-                                    if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                        membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
-                                    }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
-                                        membRowData.add("$userName="+us.getDingdingUserid()+"$");
-                                    }else {
-                                        membRowData.add(npu.getName());
-                                    }
-
-                                    //增加部门
-                                    Optional<Department> first = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
-                                    if (first.isPresent()) {
+                        //无项目人员成本
+                        if (assignNoProUser != null && assignNoProUser) {
+                            for (Finance npu : noProjectUser) {
+                                List<String> membRowData = new ArrayList<String>();
+                                membRowData.add(p.projectCode);
+                                membRowData.add(p.project);
+                                Double workingTime = new Double(0);
+                                Finance userFinance = npu;
+                                Optional<Map> op = noPUserDataList.stream().filter(map->((Integer)map.get("projectId")).equals(p.projectId) && ((String)map.get("creatorId")).equals(npu.getUserId())).findFirst();
+                                if (op.isPresent()) {
+                                    Map percentMap = op.get();
+                                    double percent = (double)percentMap.get("percent");
+                                    if (percent > 0) {
+                                        //各项收入按比例计算,累加到当前项目上
+                                        Finance newFinance = Finance.getByPercent(npu, percent);
+
+                                        BigDecimal cost = newFinance.getTotalCost();
+                                        BigDecimal salary = newFinance.getMonthCost();
+                                        BigDecimal bonus = newFinance.getBonus();
+                                        BigDecimal allowance = newFinance.getAllowance();
+                                        BigDecimal old = newFinance.getInsuranceOld();
+                                        BigDecimal medical = newFinance.getInsuranceMedical();
+                                        BigDecimal loseJob = newFinance.getInsuranceLosejob();
+                                        BigDecimal injury = newFinance.getInsuranceInjury();
+                                        BigDecimal house = newFinance.getHouseFund();
+                                        BigDecimal field1 = newFinance.getCustomField1() == null? new BigDecimal(0):newFinance.getCustomField1();
+                                        BigDecimal field2 = newFinance.getCustomField2() == null? new BigDecimal(0):newFinance.getCustomField2();
+                                        BigDecimal field3 = newFinance.getCustomField3() == null? new BigDecimal(0):newFinance.getCustomField3();
+                                        BigDecimal field4 = newFinance.getCustomField4() == null? new BigDecimal(0):newFinance.getCustomField4();
+                                        BigDecimal field5 = newFinance.getCustomField5() == null? new BigDecimal(0):newFinance.getCustomField5();
+                                        BigDecimal field6 = newFinance.getCustomField6() == null? new BigDecimal(0):newFinance.getCustomField6();
+                                        BigDecimal field7 = newFinance.getCustomField7() == null? new BigDecimal(0):newFinance.getCustomField7();
+                                        User us = userList.stream().filter(u->u.getId().equals(npu.getUserId())).findFirst().get();
                                         if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
-                                            membRowData.add("$departmentName="+(first.get().getCorpwxDeptid()==null?"":first.get().getCorpwxDeptid())+"$");
+                                            membRowData.add("$userName="+(us.getCorpwxUserid()==null?"":us.getCorpwxUserid())+"$");
                                         }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
-                                            membRowData.add("$departmentName="+(first.get().getDdDeptid()==null?"":first.get().getDdDeptid())+"$");
+                                            membRowData.add("$userName="+us.getDingdingUserid()+"$");
                                         }else {
-                                            membRowData.add(first.get().getDepartmentName());
+                                            membRowData.add(npu.getName());
                                         }
-                                    } else {
-                                        membRowData.add("");
-                                    }
-                                    //自定义字段的显示
-                                    for (int i = 0; i < userCustoms.size(); i++) {
-                                        switch (i){
-                                            case 0:
-                                                membRowData.add(us.getPlate1()==null?"":us.getPlate1());
-                                                break;
-                                            case 1:
-                                                membRowData.add(us.getPlate2()==null?"":us.getPlate2());
-                                                break;
-                                            case 2:
-                                                membRowData.add(us.getPlate3()==null?"":us.getPlate3());
-                                                break;
-                                            case 3:
-                                                membRowData.add(us.getPlate4()==null?"":us.getPlate4());
-                                                break;
-                                            case 4:
-                                                membRowData.add(us.getPlate5()==null?"":us.getPlate5());
-                                                break;
+
+                                        //增加部门
+                                        Optional<Department> first = allDepartments.stream().filter(dp -> dp.getDepartmentId().equals(us.getDepartmentId())).findFirst();
+                                        if (first.isPresent()) {
+                                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                                membRowData.add("$departmentName="+(first.get().getCorpwxDeptid()==null?"":first.get().getCorpwxDeptid())+"$");
+                                            }else if(dingding!=null&&dingding.getContactNeedTranslate()==1){
+                                                membRowData.add("$departmentName="+(first.get().getDdDeptid()==null?"":first.get().getDdDeptid())+"$");
+                                            }else {
+                                                membRowData.add(first.get().getDepartmentName());
+                                            }
+                                        } else {
+                                            membRowData.add("");
                                         }
+                                        //自定义字段的显示
+                                        for (int i = 0; i < userCustoms.size(); i++) {
+                                            switch (i){
+                                                case 0:
+                                                    membRowData.add(us.getPlate1()==null?"":us.getPlate1());
+                                                    break;
+                                                case 1:
+                                                    membRowData.add(us.getPlate2()==null?"":us.getPlate2());
+                                                    break;
+                                                case 2:
+                                                    membRowData.add(us.getPlate3()==null?"":us.getPlate3());
+                                                    break;
+                                                case 3:
+                                                    membRowData.add(us.getPlate4()==null?"":us.getPlate4());
+                                                    break;
+                                                case 4:
+                                                    membRowData.add(us.getPlate5()==null?"":us.getPlate5());
+                                                    break;
+                                            }
+                                        }
+                                        membRowData.add(workTimeFormatter.format(workingTime));
+                                        membRowData.add(salary.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(bonus.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(allowance.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(old.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(medical.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(loseJob.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(injury.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        membRowData.add(house.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        //自定义字段
+                                        if (cusColList.size() > 0) {
+                                            membRowData.add(field1.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 1) {
+                                            membRowData.add(field2.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 2) {
+                                            membRowData.add(field3.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 3) {
+                                            membRowData.add(field4.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 4) {
+                                            membRowData.add(field5.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 5) {
+                                            membRowData.add(field6.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        if (cusColList.size() > 6) {
+                                            membRowData.add(field7.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        }
+                                        membRowData.add(cost.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
+                                        allList.add(membRowData);
                                     }
-                                    membRowData.add(workTimeFormatter.format(workingTime));
-                                    membRowData.add(salary.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(bonus.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(allowance.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(old.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(medical.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(loseJob.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(injury.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    membRowData.add(house.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    //自定义字段
-                                    if (cusColList.size() > 0) {
-                                        membRowData.add(field1.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 1) {
-                                        membRowData.add(field2.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 2) {
-                                        membRowData.add(field3.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 3) {
-                                        membRowData.add(field4.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 4) {
-                                        membRowData.add(field5.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 5) {
-                                        membRowData.add(field6.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    if (cusColList.size() > 6) {
-                                        membRowData.add(field7.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    }
-                                    membRowData.add(cost.setScale(6, BigDecimal.ROUND_HALF_UP).toPlainString());
-                                    allList.add(membRowData);
                                 }
                             }
                         }
@@ -1565,18 +1603,20 @@ public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> impl
                             multiSheetDataList[i].add(newRow);
                         }
                     }
-                    if(0 == onlyTotal){
-                        return excelExportService.exportMultiSheetGeneralExcelTotal(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
-
-                    }else{
-                        return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
-                    }
+                    return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+//                    if(0 == onlyTotal){
+//                        return excelExportService.exportMultiSheetGeneralExcelTotal(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+//
+//                    }else{
+//                        return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+//                    }
                 } else {
-                    if(0 == onlyTotal){
-                        return excelExportService.exportGeneralExcelTotal(wxCorpInfo,dingding,fileName , allList, path);
-                    }else{
-                        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
-                    }
+                    return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
+//                    if(0 == onlyTotal){
+//                        return excelExportService.exportGeneralExcelTotal(wxCorpInfo,dingding,fileName , allList, path);
+//                    }else{
+//                        return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , allList, path);
+//                    }
                 }
             } catch (Exception e) {
                 e.printStackTrace();

+ 36 - 25
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/FileZipUtil.java

@@ -8,7 +8,9 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -21,7 +23,7 @@ public class FileZipUtil {
      * @param fileName 下载时的文件名称
      * @param postfix 下载时的文件后缀 .zip/.rar
      */
-    public static void exportZip(HttpServletResponse response, String sourceFilePath, String fileName, String postfix) {
+    public static void exportZip(HttpServletResponse response, String sourceFilePath, List<String> fileNames, String fileName, String postfix) {
         // 默认文件名以时间戳作为前缀
         if(StringUtils.isBlank(fileName)){
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
@@ -32,7 +34,7 @@ public class FileZipUtil {
         try {
             OutputStream os = response.getOutputStream();
             // 接收压缩包字节
-            byte[] data = createZip(sourceFilePath);
+            byte[] data = createZip(sourceFilePath,fileNames);
             response.reset();
             response.setCharacterEncoding("UTF-8");
             response.addHeader("Access-Control-Allow-Origin", "*");
@@ -56,12 +58,12 @@ public class FileZipUtil {
      * @return byte[]
      * @throws Exception
      */
-    private static byte[] createZip(String sourceFilePath) throws Exception{
+    private static byte[] createZip(String sourceFilePath,List<String> fileNames) throws Exception{
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         ZipOutputStream zip = new ZipOutputStream(outputStream);
         // 将目标文件打包成zip导出
         File file = new File(sourceFilePath);
-        handlerFile(zip, file,"");
+        handlerFile(zip, file,"",fileNames);
         // 无异常关闭流,它将无条件的关闭一个可被关闭的对象而不抛出任何异常。
         IOUtils.closeQuietly(zip);
         return outputStream.toByteArray();
@@ -74,32 +76,41 @@ public class FileZipUtil {
      * @param dir
      * @throws Exception
      */
-    private static void handlerFile(ZipOutputStream zip, File file, String dir) throws Exception {
-        // 如果当前的是文件夹,则循环里面的内容继续处理
-        if (file.isDirectory()) {
-            //得到文件列表信息
-            File[] fileArray = file.listFiles();
-            if (fileArray == null) {
-                return;
+    private static void handlerFile(ZipOutputStream zip, File file, String dir,List<String> fileNames) throws Exception {
+        // 得到文件列表信息
+        File[] fileArray = file.listFiles();
+
+        if (fileArray == null) {
+            extracted(zip, file, dir);
+        } else {
+            // 过滤出与 fileNames 匹配的文件
+            for (File f : fileArray) {
+                if (fileNames.contains(f.getName())) { // 使用 contains 方法检查
+                    extracted(zip, f, dir + f.getName()); // 打包处理匹配的文件
+                } else if (f.isDirectory()) {
+                    // 递归处理子目录
+                    handlerFile(zip, f, dir + f.getName() + "/", fileNames);
+                }
             }
-            //将文件夹添加到下一级打包目录
+        }
+
+            /*//将文件夹添加到下一级打包目录
             zip.putNextEntry(new ZipEntry(dir + "/"));
             dir = dir.length() == 0 ? "" : dir + "/";
             // 递归将文件夹中的文件打包
             for (File f : fileArray) {
-                handlerFile(zip, f, dir + f.getName());
-            }
-        } else {
-            // 如果当前的是文件,打包处理
-            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
-            ZipEntry entry = new ZipEntry(dir);
-            zip.putNextEntry(entry);
-            zip.write(FileUtils.readFileToByteArray(file));
-            IOUtils.closeQuietly(bis);
-            zip.flush();
-            zip.closeEntry();
-        }
-    }
+                handlerFile(zip, f, dir + f.getName(),fileNames);
+            }*/
 
+    }
 
+    private static void extracted(ZipOutputStream zip, File file, String dir) throws IOException {
+        // 如果当前的是文件,打包处理
+        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
+        ZipEntry entry = new ZipEntry(dir); // 使用完整路径(包含文件名)
+        zip.putNextEntry(entry);
+        zip.write(FileUtils.readFileToByteArray(file));
+        IOUtils.closeQuietly(bis);
+        zip.closeEntry(); // 关闭当前条目
+    }
 }

+ 10 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/contract/components/contractManagement.vue

@@ -81,6 +81,7 @@
     <el-table :data="contractList" v-loading="listLoading" :height="tableHeight" border highlight-current-row>
       <el-table-column prop="number" :label="$t('contractno')" min-width="190"></el-table-column>
       <el-table-column prop="name" :label="$t('he-tong-ming-cheng')" min-width="190"></el-table-column>
+      <el-table-column prop="projectName" :label="$t('rselatedprojects')" min-width="190"></el-table-column>
       <el-table-column prop="amounts" :label="$t('contractamount')" min-width="135" align="right" header-align="center">
         <span slot-scope="scope">¥ {{scope.row.amounts ? scope.row.amounts.toFixed(2) : '0.00'}}</span>
       </el-table-column>
@@ -256,6 +257,10 @@
           <el-form-item :label="$t('he-tong-ming-cheng')">
             {{contractForm.name}}
           </el-form-item>
+          <el-form-item :label="$t('rselatedprojects')">
+            {{contractForm.projectName}}
+          </el-form-item>
+          
           <el-form-item :label="$t('contractamount')">
             ¥ {{contractForm.amounts}}
           </el-form-item>
@@ -917,6 +922,11 @@ export default {
           }
           this.submitLoading = true
           delete this.contractForm.files
+          delete this.contractForm.msg
+          delete this.contractForm.nextPaymentDate
+          delete this.contractForm.nextPaymentAmount
+          delete this.contractForm.payCustomizedData
+          delete this.contractForm.checkerId
           this.contractForm.paymentListStr = JSON.stringify(this.contractPaymentList);
           this.http.post(this.dialogTitle == this.$t('add') ? '/contract/addContract' : '/contract/editContract',this.contractForm,
           res => {