Browse Source

泓浒生成制造成本表增加财务自定义项的拆分Sheet数据
修复生产包令号统计的bug

QuYueTing 5 days ago
parent
commit
f1a9d1c2ac
17 changed files with 254 additions and 76 deletions
  1. 4 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  2. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java
  3. 11 9
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ContractCustom.java
  4. 5 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProduceTime.java
  5. 4 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelParserService.java
  6. 2 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java
  7. 16 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java
  8. 9 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  9. 22 21
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java
  10. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  11. 123 12
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  12. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java
  13. 29 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WebServiceUtils.java
  14. 4 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractCustomMapper.xml
  15. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  16. 6 5
      fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue
  17. 13 4
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

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

@@ -3338,15 +3338,15 @@ public class ReportController {
     }
 
     @RequestMapping("/getProduceTimeReport")
-    public HttpRespMsg getProduceTimeReport(Integer projectId, String startDate,String endDate) {
+    public HttpRespMsg getProduceTimeReport(Integer projectId, String ymonth) {
         User user = userMapper.selectById(request.getHeader("TOKEN"));
-        return reportService.getProduceTimeReport(user.getCompanyId(), projectId,startDate,endDate);
+        return reportService.getProduceTimeReport(user.getCompanyId(), projectId,ymonth);
     }
 
     @RequestMapping("/exportProduceTimeReport")
-    public HttpRespMsg exportProduceTimeReport(Integer projectId, String startDate,String endDate) {
+    public HttpRespMsg exportProduceTimeReport(Integer projectId, String ymonth) {
         User user = userMapper.selectById(request.getHeader("TOKEN"));
-        return reportService.exportProduceTimeReport(user.getCompanyId(), projectId,startDate,endDate);
+        return reportService.exportProduceTimeReport(user.getCompanyId(), projectId,ymonth);
     }
 
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -1110,7 +1110,7 @@ public class WeiXinCorpController {
                             //处理项目参与人
                             if (user.getDepartmentId() != null && user.getDepartmentId() != 0) {
                                 List<Participation> toAddList = new ArrayList<>();
-                                projectDeptRelateMapper.selectList(new QueryWrapper<ProjectDeptRelate>().eq("department_id", user.getDepartmentId()).eq("company_id", companyId))
+                                projectDeptRelateMapper.selectList(new QueryWrapper<ProjectDeptRelate>().eq("department_id", user.getDepartmentId()))
                                         .forEach(projectDeptRelate -> {
                                             Participation participation = new Participation();
                                             participation.setProjectId(projectDeptRelate.getProjectId());

+ 11 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ContractCustom.java

@@ -2,11 +2,10 @@ package com.management.platform.entity;
 
 import java.math.BigDecimal;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
@@ -16,11 +15,11 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
- *
+ * 
  * </p>
  *
  * @author Seyason
- * @since 2024-09-30
+ * @since 2025-07-21
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -126,22 +125,25 @@ public class ContractCustom extends Model<ContractCustom> {
     private String stampDutyItems;
 
     /**
-     * 印花税缴纳状态 0无需缴纳、1未缴纳、2已缴纳、3部分缴纳。
-     * 合同新增后,默认置值未缴纳,状态随时可修改,不予审核状态关联
+     * 印花税缴纳状态 0无需缴纳、1未缴纳、2已缴纳、3部分缴纳
      */
     @TableField("stamp_duty_status")
     private Integer stampDutyStatus;
 
     /**
-     * 印花税缴纳时间(最新)
-     * 印花税缴纳状态为无需缴纳、未缴纳时,禁用;
-     * 部分缴纳、已缴纳时,启用。
+     * 印花税缴纳时间
      */
     @TableField("stamp_duty_time")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate stampDutyTime;
 
+    /**
+     * 是否平台采购
+     */
+    @TableField("is_platform_buy")
+    private Boolean isPlatformBuy;
+
 
     @Override
     protected Serializable pkVal() {

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/vo/ProduceTime.java

@@ -1,5 +1,6 @@
 package com.management.platform.entity.vo;
 
+import com.management.platform.entity.Finance;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -24,4 +25,8 @@ public class ProduceTime {
     private double salesTime;
     private BigDecimal salesCost;
     private double projectTime;
+
+    private double userTotalTime;//员工总工时数
+
+    private Finance userFinance;
 }

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelParserService.java

@@ -172,6 +172,10 @@ public class ExcelParserService {
 
     public static double calculateZhengBeiWorkHours(String startTime, String endTime) {
         // 简单计算工作时长(小时)
+        if (startTime.compareTo("08:30") < 0 && endTime.compareTo("08:30") < 0) {
+            //上下班都是八点半之前,忽略掉
+            return 0;
+        }
         // 实际应用中需要更精确的计算,考虑午休时间等
         if (startTime.compareTo("08:30") < 0) {
             startTime = "08:30";

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

@@ -184,7 +184,7 @@ public interface ReportService extends IService<Report> {
 
     HttpRespMsg exportReportRateOfTask(Integer projectId, String userIds, Integer companyId, Integer type);
 
-    HttpRespMsg getProduceTimeReport(Integer companyId, Integer projectId, String startDate, String endDate);
+    HttpRespMsg getProduceTimeReport(Integer companyId, Integer projectId, String ymonth);
 
-    HttpRespMsg exportProduceTimeReport(Integer companyId, Integer projectId, String startDate, String endDate);
+    HttpRespMsg exportProduceTimeReport(Integer companyId, Integer projectId, String ymonth);
 }

+ 16 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ContractServiceImpl.java

@@ -1309,8 +1309,10 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
             headList.add("合同类别");
             headList.add("二级分类");
             headList.add("供应商名称");
-            headList.add("供应商联系人");
-            headList.add("对方联系电话");
+            //合并为一列
+//            headList.add("供应商联系人");
+//            headList.add("对方联系电话");
+            headList.add("供应商联系人及电话");
             headList.add("使用部门");
             headList.add("经费来源");
             headList.add("合同承办人");
@@ -1358,8 +1360,10 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                             ContractCustom customData = contract.getCustomData();
                             if (customData!=null){
                                 item.add(customData.getCustomerOrg()==null?"":customData.getCustomerOrg());
-                                item.add(customData.getCustomerContact()==null?"":customData.getCustomerContact());
-                                item.add(customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+//                                item.add(customData.getCustomerContact()==null?"":customData.getCustomerContact());
+//                                item.add(customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+                                String combinedData = (customData.getCustomerContact()==null?"":(customData.getCustomerContact()+ " "))  + (customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+                                item.add(combinedData);
                                 item.add(customData.getUseDepartment()==null?"":customData.getUseDepartment());
                                 item.add(customData.getFundsSource()==null?"":(customData.getFundsSource().equals("1")?"科研":"其他(专项等)"));
                                 item.add(customData.getUndertaker()==null?"":customData.getUndertaker());
@@ -1368,7 +1372,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                             }else {
                                 item.add("");
                                 item.add("");
-                                item.add("");
+//                                item.add("");
                                 item.add("");
                                 item.add("");
                                 item.add("");
@@ -1456,8 +1460,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                         }
                         else {
                             ArrayList<String> item = new ArrayList<>();
-                            for (int i1 = 0; i1 < 25; i1++) {
-                                item.add("" );
+                            for (int i1 = 0; i1 < 24; i1++) {
+                                item.add("");
                             }
 
 //                            item.add(payCustomizedList.get(j).getPayDate()==null?"":payCustomizedList.get(j).getPayDate());
@@ -1484,8 +1488,10 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                     ContractCustom customData = contract.getCustomData();
                     if (customData!=null){
                         item.add(customData.getCustomerOrg()==null?"":customData.getCustomerOrg());
-                        item.add(customData.getCustomerContact()==null?"":customData.getCustomerContact());
-                        item.add(customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+//                        item.add(customData.getCustomerContact()==null?"":customData.getCustomerContact());
+//                        item.add(customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+                        String combinedData = (customData.getCustomerContact()==null?"":(customData.getCustomerContact()+ " "))  + (customData.getCustomerPhone()==null?"":customData.getCustomerPhone());
+                        item.add(combinedData);
                         item.add(customData.getUseDepartment()==null?"":customData.getUseDepartment());
                         item.add(customData.getFundsSource()==null?"":(customData.getFundsSource().equals("1")?"科研":"其他(专项等)"));
                         item.add(customData.getUndertaker()==null?"":customData.getUndertaker());
@@ -1493,7 +1499,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                         item.add(customData.getSignDate()==null?"":customData.getSignDate());
                     }else {
                         item.add("");
-                        item.add("");
+//                        item.add("");
                         item.add("");
                         item.add("");
                         item.add("");

+ 9 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -2288,8 +2288,9 @@ public class DingDingServiceImpl implements DingDingService {
         req.setUserIds(ddIds);
         req.setCheckDateFrom(startDate+ " 02:00:00");
         //考虑到可能加班到凌晨,需要设置第二天凌晨6点为下班时间
-        endDate = LocalDate.parse(endDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")).plusDays(1).toString();
-        req.setCheckDateTo(endDate+ " 06:00:00");
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        endDate = LocalDate.parse(endDate, dateTimeFormatter).plusDays(1).toString();
+        req.setCheckDateTo(endDate+ " 09:00:00");
         req.setIsI18n(false);
         OapiAttendanceListRecordResponse rsp = null;
         try {
@@ -2322,6 +2323,9 @@ public class DingDingServiceImpl implements DingDingService {
                     while (dayIter.hasNext()) {
                         Long d = dayIter.next();
                         LocalDate workDate =  LocalDateTime.ofEpochSecond(d/1000, 0, ZoneOffset.ofHours(8)).toLocalDate();
+                        if (workDate.isBefore(LocalDate.parse(startDate, dateTimeFormatter))) {
+                            continue;
+                        }
                         UserDingdingTime timeItem = new UserDingdingTime();
                         timeItem.setWorkDate(workDate);
                         List<DdingCardTimeItem> oneDayTimes = dailyMap.get(d);
@@ -2383,7 +2387,9 @@ public class DingDingServiceImpl implements DingDingService {
                             if (findOld.isPresent()) {
                                 timeItem.setId(findOld.get().getId());
                             }
-                            cardRecordList.add(timeItem);
+                            if (timeItem.getWorkHours() > 0) {
+                                cardRecordList.add(timeItem);
+                            }
                         }
                     }
                 }

+ 22 - 21
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java

@@ -68,17 +68,18 @@ public class ProjectMainServiceImpl extends ServiceImpl<ProjectMainMapper, Proje
                 httpRespMsg.setError(MessageUtils.message("name.nameRepeat"));
                 return httpRespMsg;
             }
-            if (companyId==4215){
-                if (projectMain.getWorkOrderNumType()!=null&& StringUtils.isNotEmpty(projectMain.getWorkOrderNum())){
-                    Integer count2 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
-                            .eq("work_order_num", projectMain.getWorkOrderNum()).eq("work_order_num_type", projectMain.getWorkOrderNumType())
-                            .ne("id", projectMain.getId()));
-                    if(count2>0){
-                        httpRespMsg.setError(MessageUtils.message("other.AlreadyExistsPackage"));
-                        return httpRespMsg;
-                    }
-                }
-            }
+            //去掉工作包号重复的校验
+//            if (companyId==4215){
+//                if (projectMain.getWorkOrderNumType()!=null&& StringUtils.isNotEmpty(projectMain.getWorkOrderNum())){
+//                    Integer count2 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
+//                            .eq("work_order_num", projectMain.getWorkOrderNum()).eq("work_order_num_type", projectMain.getWorkOrderNumType())
+//                            .ne("id", projectMain.getId()));
+//                    if(count2>0){
+//                        httpRespMsg.setError(MessageUtils.message("other.AlreadyExistsPackage"));
+//                        return httpRespMsg;
+//                    }
+//                }
+//            }
             boolean nameChanged = !oldProject.getName().equals(projectMain.getName());
             boolean categoryChanged = !oldProject.getCategoryId().equals(projectMain.getCategoryId());
             projectMainMapper.updateById(projectMain);
@@ -110,16 +111,16 @@ public class ProjectMainServiceImpl extends ServiceImpl<ProjectMainMapper, Proje
                 httpRespMsg.setError(MessageUtils.message("name.nameRepeat"));
                 return httpRespMsg;
             }
-            if (companyId==4215){
-                if (projectMain.getWorkOrderNumType()!=null&& StringUtils.isNotEmpty(projectMain.getWorkOrderNum())){
-                    Integer count4 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
-                            .eq("work_order_num", projectMain.getWorkOrderNum()).eq("work_order_num_type", projectMain.getWorkOrderNumType()));
-                    if(count4>0){
-                        httpRespMsg.setError(MessageUtils.message("other.AlreadyExistsPackage"));
-                        return httpRespMsg;
-                    }
-                }
-            }
+//            if (companyId==4215){
+//                if (projectMain.getWorkOrderNumType()!=null&& StringUtils.isNotEmpty(projectMain.getWorkOrderNum())){
+//                    Integer count4 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
+//                            .eq("work_order_num", projectMain.getWorkOrderNum()).eq("work_order_num_type", projectMain.getWorkOrderNumType()));
+//                    if(count4>0){
+//                        httpRespMsg.setError(MessageUtils.message("other.AlreadyExistsPackage"));
+//                        return httpRespMsg;
+//                    }
+//                }
+//            }
             projectMainMapper.insert(projectMain);
         }
         return httpRespMsg;

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

@@ -14159,9 +14159,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         List<ProjectMain> typeCollect0 = projectMainList.stream().filter(m -> m.getWorkOrderNumType() == 0).collect(Collectors.toList());
         List<ProjectMain> typeCollect1 = projectMainList.stream().filter(m -> m.getWorkOrderNumType() == 1).collect(Collectors.toList());
         List<ProjectMain> typeCollect2 = projectMainList.stream().filter(m -> m.getWorkOrderNumType() == 2).collect(Collectors.toList());
-        List<String> typeNum0= typeCollect0.stream().map(ProjectMain::getWorkOrderNum).collect(Collectors.toList());
-        List<String> typeNum1= typeCollect1.stream().map(ProjectMain::getWorkOrderNum).collect(Collectors.toList());
-        List<String> typeNum2= typeCollect2.stream().map(ProjectMain::getWorkOrderNum).collect(Collectors.toList());
+        List<String> typeNum0= typeCollect0.stream().map(ProjectMain::getWorkOrderNum).distinct().collect(Collectors.toList());
+        List<String> typeNum1= typeCollect1.stream().map(ProjectMain::getWorkOrderNum).distinct().collect(Collectors.toList());
+        List<String> typeNum2= typeCollect2.stream().map(ProjectMain::getWorkOrderNum).distinct().collect(Collectors.toList());
         LinkedHashMap<String, Object> totalMap = new LinkedHashMap<>();
 //        totalMap.put("totalRow",projectMainList.size());//总列数
 //        totalMap.put("mainFly",typeCollect0.size());

+ 123 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -114,6 +114,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ReportLogDetailMapper reportLogDetailMapper;
     @Resource
+    private FinanceFixedcolnameService financeFixedcolnameService;
+    @Resource
     private CompanyDingdingService companyDingdingService;
     @Resource
     private ReportBatchMapper reportBatchMapper;
@@ -134,6 +136,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     private ReportLogService reportLogService;
     @Resource
+    private FinanceTblcuscolMapper financeTblcuscolMapper;
+    @Resource
     ReportExtraDegreeMapper reportExtraDegreeMapper;
     @Resource
     WxCorpInfoService wxCorpInfoService;
@@ -241,14 +245,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Value(value = "${upload.path}")
     private String path;
     @Autowired
-    private BusinessTripMapper businessTripMapper;
-    @Autowired
     private BustripProjectMapper bustripProjectMapper;
     @Resource
     private CompanyDingdingMapper companyDingdingMapper;
     @Resource
     private SysRoleFunctionService sysRoleFunctionService;
-    private DingDingService dingDingService;
+    @Resource
+    private FinanceMapper financeMapper;
 
 
     //获取报告列表
@@ -12127,15 +12130,17 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg getProduceTimeReport(Integer companyId, Integer projectId, String startDate, String endDate) {
+    public HttpRespMsg getProduceTimeReport(Integer companyId, Integer projectId, String ymonth) {
         HttpRespMsg msg = new HttpRespMsg();
-        msg.setData(getProduceTime(companyId, projectId, startDate, endDate));
+        msg.setData(getProduceTime(companyId, projectId, ymonth));
         return msg;
     }
 
-    private List<ProduceTime> getProduceTime(Integer companyId, Integer projectId, String startDate, String endDate) {
+    private List<ProduceTime> getProduceTime(Integer companyId, Integer projectId, String ymonth) {
         Integer leaveProjectId = 80333;//请假项目,排除在外
         Integer publicProjectId = 77651;//公共项目
+        String startDate = ymonth + "-01";
+        String endDate = ymonth + "-31";
         QueryWrapper<Report> wrapper = new QueryWrapper<Report>().select("id, create_date, creator_id, project_id,dept_id, working_time, group_id, extra_field4").eq("company_id", companyId).ne("project_id", leaveProjectId)
                 .eq("state", 1).between("create_date", startDate, endDate);
         if (projectId != null) {
@@ -12150,6 +12155,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         Integer rdDeptId = departmentList.stream().filter(dept->dept.getDepartmentName().equals("研发中心")).findFirst().get().getDepartmentId();
         Integer cuServiceDeptId = departmentList.stream().filter(dept->dept.getDepartmentName().equals("售后部")).findFirst().get().getDepartmentId();
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+        //获取薪资数据
+        List<Finance> finances = financeMapper.selectList(new QueryWrapper<Finance>().eq("company_id", companyId).eq("ymonth",ymonth));
+        //按人员分组,获取工时数
+        Map<String, Double> userTime = reportList.stream().collect(Collectors.groupingBy(Report::getCreatorId, Collectors.summingDouble(Report::getWorkingTime)));
+        finances.forEach(f->{
+            String uid = f.getUserId();
+            Double b = userTime.get(uid);
+            if (b != null) {
+                BigDecimal avgHourCost = f.getTotalCost().divide(new BigDecimal(b),6, BigDecimal.ROUND_HALF_UP);
+                f.setHourCost(avgHourCost);
+                //同步设置人员的时薪
+                userList.stream().filter(u->u.getId().equals(f.getUserId())).findFirst().ifPresent(u->u.setCost(avgHourCost));
+            }
+        });
+
         List<ProduceTime> result = new ArrayList<>();
         if (reportList.size() > 0) {
             //按照项目和人员进行分组统计
@@ -12170,8 +12190,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     Map<String, List<Report>> membReportList = reports.stream().collect(Collectors.groupingBy(Report::getCreatorId));
 
                     membReportList.forEach((membId, oneMembList )-> {
-                        User user = userList.stream().filter(u->u.getId().equals(membId)).findFirst().get();
                         ProduceTime produceTimeItem = new ProduceTime();
+                        produceTimeItem.setUserTotalTime(userTime.get(membId));
+                        User user = userList.stream().filter(u->u.getId().equals(membId)).findFirst().get();
+                        Optional<Finance> f = finances.stream().filter(finance -> finance.getUserId().equals(membId)).findFirst();
+                        if (f.isPresent()) {
+                            Finance userFinance = f.get();
+                            produceTimeItem.setUserFinance(userFinance);
+                        }
+
                         produceTimeItem.setProjectId(p.getId());
                         produceTimeItem.setProjectCode(p.getProjectCode());
                         produceTimeItem.setProjectName(projectName);
@@ -12220,7 +12247,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         produceTimeItem.setManufactureCost(user.getCost().multiply(new BigDecimal(manufactureTime)).setScale(2, RoundingMode.HALF_UP));
                         produceTimeItem.setRdCost(user.getCost().multiply(new BigDecimal(rdTime)).setScale(2, RoundingMode.HALF_UP));
                         produceTimeItem.setSalesCost(user.getCost().multiply(new BigDecimal(cusTime)).setScale(2, RoundingMode.HALF_UP));
-
                         result.add(produceTimeItem);
                     });
                 });
@@ -12230,8 +12256,42 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     }
 
     @Override
-    public HttpRespMsg exportProduceTimeReport(Integer companyId, Integer projectId, String startDate, String endDate) {
+    public HttpRespMsg exportProduceTimeReport(Integer companyId, Integer projectId, String ymonth) {
         HttpRespMsg msg = new HttpRespMsg();
+        //准备多张sheet
+        final List<FinanceTblcuscol> cusColList = financeTblcuscolMapper.selectList(new QueryWrapper<FinanceTblcuscol>().eq("company_id", companyId));
+        List<String> sheetNameList = new ArrayList<String>();
+        sheetNameList.add("财务数据分摊总表");
+        FinanceFixedcolname fixedItem = financeFixedcolnameService.getFixed(companyId);
+        if(!StringUtils.isEmpty(fixedItem.getMonthCost())){
+            sheetNameList.add(fixedItem.getMonthCost()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getBonus())){
+            sheetNameList.add(fixedItem.getBonus()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getAllowance())){
+            sheetNameList.add(fixedItem.getAllowance()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getInsuranceOld())){
+            sheetNameList.add(fixedItem.getInsuranceOld()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getInsuranceMedical())){
+            sheetNameList.add(fixedItem.getInsuranceMedical()+"分摊表");
+        }
+
+        if(!StringUtils.isEmpty(fixedItem.getInsuranceLosejob())){
+            sheetNameList.add(fixedItem.getInsuranceLosejob()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getInsuranceInjury())){
+            sheetNameList.add(fixedItem.getInsuranceInjury()+"分摊表");
+        }
+        if(!StringUtils.isEmpty(fixedItem.getHouseFund())){
+            sheetNameList.add(fixedItem.getHouseFund()+"分摊表");
+        }
+        for (FinanceTblcuscol col : cusColList) {
+            sheetNameList.add(col.getFieldName()+"分摊表");
+        }
+
         List<List<String>> dataList = new ArrayList<>();
         List<String> headList = new ArrayList<>();
         headList.add("项目编号");
@@ -12247,7 +12307,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         headList.add("研发支出-工资");
         headList.add("销售费用-工资");
         dataList.add(headList);
-        List<ProduceTime> produceTimeList = getProduceTime(companyId, projectId, startDate, endDate);
+        List<ProduceTime> produceTimeList = getProduceTime(companyId, projectId, ymonth);
         for (ProduceTime produceTime : produceTimeList) {
             List<String> list = new ArrayList<>();
             list.add(produceTime.getProjectCode());
@@ -12266,9 +12326,60 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
         //生成excel文件导出
         //String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
-        String fileName = "生产制造工时费用统计_"+ startDate+"至"+endDate+"_"+System.currentTimeMillis();
+        String fileName = "生产制造工时费用统计_"+ ymonth+"_"+System.currentTimeMillis();
         try {
-            return excelExportService.exportGeneralExcelByTitleAndList(null,null, fileName, dataList, path);
+            List[] multiSheetDataList = new ArrayList[sheetNameList.size()];
+            multiSheetDataList[0] = dataList;
+            for (int i = 1; i < sheetNameList.size(); i++) {
+                String sheetName = sheetNameList.get(i);
+                multiSheetDataList[i] = new ArrayList();
+                multiSheetDataList[i].add(headList);//每个表单的头都一样,数据不一样而已
+                for (ProduceTime produceTime : produceTimeList) {
+                    List<String> list = new ArrayList<String>();
+                    list.add(produceTime.getProjectCode());
+                    list.add(produceTime.getProjectName());
+                    list.add(produceTime.getUserName());
+                    list.add(produceTime.getDepartmentName());
+                    list.add(""+produceTime.getTotalTime());
+                    list.add(produceTime.getProduceTime()+"");
+                    list.add(produceTime.getWorksheetDeptName());
+                    //取费用成本项的值,按比例计算
+                    Finance userFinance = produceTime.getUserFinance();
+                    BigDecimal cost = new BigDecimal(0);
+                    if (userFinance != null) {
+                        if (sheetName.equals(fixedItem.getMonthCost()+"分摊表")){
+                            cost = userFinance.getMonthCost();
+                        } else if (sheetName.equals(fixedItem.getAllowance()+"分摊表")) {
+                            cost = userFinance.getAllowance();
+                        } else if (sheetName.equals(fixedItem.getInsuranceOld()+"分摊表")) {
+                            cost = userFinance.getInsuranceOld();
+                        } else if (sheetName.equals(fixedItem.getInsuranceMedical()+"分摊表")) {
+                            cost = userFinance.getInsuranceMedical();
+                        } else if (sheetName.equals(fixedItem.getInsuranceLosejob()+"分摊表")) {
+                            cost = userFinance.getInsuranceLosejob();
+                        } else if (sheetName.equals(fixedItem.getInsuranceInjury()+"分摊表")) {
+                            cost = userFinance.getInsuranceInjury();
+                        } else if (sheetName.equals(fixedItem.getHouseFund()+"分摊表")) {
+                            cost = userFinance.getHouseFund();
+                        } else if (sheetName.equals(fixedItem.getBonus()+"分摊表")) {
+                            cost = userFinance.getBonus();
+                        }
+                    }
+
+                    BigDecimal produceCost = new BigDecimal(produceTime.getProduceTime()/produceTime.getUserTotalTime()).multiply(cost).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    list.add(produceCost.toString());
+                    list.add(produceTime.getProjectTime()+"");
+                    BigDecimal manufactureCost = new BigDecimal(produceTime.getManufactureTime()/produceTime.getUserTotalTime()).multiply(cost).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    list.add(manufactureCost.toString());
+                    BigDecimal rdCost = new BigDecimal(produceTime.getRdTime()/produceTime.getUserTotalTime()).multiply(cost).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    list.add(rdCost.toString());
+                    BigDecimal salesCost = new BigDecimal(produceTime.getSalesTime()/produceTime.getUserTotalTime()).multiply(cost).setScale(2,BigDecimal.ROUND_HALF_UP);
+                    list.add(salesCost.toString());
+                    multiSheetDataList[i].add(list);
+                }
+            }
+            return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(null,null,fileName , multiSheetDataList, path, sheetNameList.toArray(new String[0]));
+//            return excelExportService.exportGeneralExcelByTitleAndList(null,null, fileName, dataList, path);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/SyncSapUtils.java

@@ -262,6 +262,7 @@ public class SyncSapUtils {
             result = result.substring(result.indexOf(">")+1, result.lastIndexOf("</n0:ProjectByElementsResponse_sync>"));
             result="<XMLDATA>"+result+"</XMLDATA>";
         }
+        System.out.println("===============打印同步的项目内容===============");
         System.out.println(result);
         XmlResponseData xmlResponseData = (XmlResponseData) CommonUtils.convertXmlStrToObject(XmlResponseData.class, result);
         return xmlResponseData;

+ 29 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/WebServiceUtils.java

@@ -2,18 +2,47 @@ package com.management.platform.util;
 
 import lombok.extern.slf4j.Slf4j;
 
+import javax.net.ssl.*;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.security.cert.X509Certificate;
 import java.util.Base64;
 
 @Slf4j
 public class WebServiceUtils {
+    public static void disableSSLVerification() {
+        try {
+            // 创建信任所有证书的信任管理器
+            TrustManager[] trustAllCerts = new TrustManager[] {
+                    new X509TrustManager() {
+                        public X509Certificate[] getAcceptedIssuers() {
+                            return null;
+                        }
+                        public void checkClientTrusted(X509Certificate[] certs, String authType) {
+                        }
+                        public void checkServerTrusted(X509Certificate[] certs, String authType) {
+                        }
+                    }
+            };
+
+            // 安装信任管理器
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, trustAllCerts, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 
+            // 创建不验证主机名的HostnameVerifier
+            HostnameVerifier allHostsValid = (hostname, session) -> true;
+            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     public static String requestByXml(String reqUrl, String sendMsg,int timeout,String userName,String password) throws Exception {
+        disableSSLVerification();
         // 开启HTTP连接ַ
         InputStreamReader isr = null;
         BufferedReader inReader = null;

+ 4 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ContractCustomMapper.xml

@@ -20,11 +20,14 @@
         <result column="is_amount_fixed" property="isAmountFixed" />
         <result column="finish_status" property="finishStatus" />
         <result column="stamp_duty_items" property="stampDutyItems" />
+        <result column="stamp_duty_status" property="stampDutyStatus" />
+        <result column="stamp_duty_time" property="stampDutyTime" />
+        <result column="is_platform_buy" property="isPlatformBuy" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        contract_id, customer_org, customer_contact, customer_phone, use_department, funds_source, undertaker, agent, sign_date, filings_date, tax_rate, amounts_no_tax, currency, is_amount_fixed, finish_status, stamp_duty_items
+        contract_id, customer_org, customer_contact, customer_phone, use_department, funds_source, undertaker, agent, sign_date, filings_date, tax_rate, amounts_no_tax, currency, is_amount_fixed, finish_status, stamp_duty_items, stamp_duty_status, stamp_duty_time, is_platform_buy
     </sql>
 
 </mapper>

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

@@ -3039,7 +3039,7 @@
         <if test="startDate!=null and startDate !='' and endDate!=null and endDate !='' ">
             and r.create_date BETWEEN #{startDate} and #{endDate}
         </if>
-        GROUP BY u.id ,pm.id
+        GROUP BY u.id ,pm.work_order_num
         <if test="pageIndex!=null and pageSize !=null">
             LIMIT #{pageIndex} ,#{pageSize}
         </if>

+ 6 - 5
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -105,6 +105,8 @@
           </span>
         </template>
 
+        <el-date-picker v-if="ins == 33" v-model="selectYmonth" type="month" placeholder="选择月" :clearable="false" @change="picks()" size="small" value-format="yyyy-MM" style="width: 160px"></el-date-picker>
+
         <!-- 项目分类 -->
         <template v-if="ins == 22">
           <span>
@@ -2175,6 +2177,7 @@ export default {
   props: {},
   data() {
     return {
+      selectYmonth:this.dayjs(new Date()).format('YYYY-MM'),
       themeColor: getThemeColor(),
       screeningCondition: { // 筛选条件的判断
         project: [4, 8, 9, 10, 11, 14, 15, 17, 19, 20, 21, 22, 28, 30, 31,34], // 项目筛选条件 (不等于)
@@ -2182,7 +2185,7 @@ export default {
         monthRange: [19, 30], // 月份区间筛选条件 (等于)
         staff: [6, 8, 9, 19, 11, 14, 18, 23, 25, 26,28, 30, 32], // 人员筛选条件 (等于)
         departments: [14, 15, 23,21,26,28,19, 30], // 部门筛选条件 (等于)
-        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26,28,33,34], // 时间段筛选条件 (等于)
+        timePeriod: [5, 6, 8, 9, 10, 11, 12, 16, 17, 18, 20, 21, 22, 24, 25, 26,28,34], // 时间段筛选条件 (等于)
       },
       efficentList:[],
       groupNames: [],
@@ -3332,8 +3335,7 @@ export default {
           fName = `生产制造成本报表.xlsx`
           url = `/report/exportProduceTimeReport`
           sl.projectId = this.proJuctId
-          sl.startDate = this.rangeDatas[0]
-          sl.endDate = this.rangeDatas[1]
+          sl.ymonth = this.selectYmonth
         } else if(this.ins == 34) {
           fName = `工作包令号工时统计表.xlsx`
           url = `/project/exportWorkOrderNumStatistics`
@@ -5381,8 +5383,7 @@ export default {
     getManufacturingCost() {
       let sl = {}
       sl.projectId = this.proJuctId
-      sl.startDate = this.rangeDatas[0]
-      sl.endDate = this.rangeDatas[1]
+      sl.ymonth = this.selectYmonth;
       this.manufacturingCostLoading = true
       this.postData(`/report/getProduceTimeReport`, { ...sl }).then(res => { 
         this.manufacturingCost = res.data || []

+ 13 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -480,6 +480,9 @@
                             v-if="reportTimeType.type == 1"
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)"
                             :placeholder="$t('defaultText.pleaseSelectWorkingHours') + domain.workingTime"
+                            filterable
+                                :allow-create="user.companyId == 469"
+                                default-first-option
                             @change="seleChn(0,domain)">
                             <el-option v-for="item in timeRange" :key="item" :value="item.toFixed(1)">{{item.toFixed(1)}}</el-option>
                             </el-select>
@@ -1319,16 +1322,16 @@
                     </el-select>
                 </el-form-item>
 
-                <el-form-item prop="exportType" :label="$t('daoChuFangShi')" v-if="user.companyId == '936' || user.companyId == '1071'">
+                <el-form-item prop="exportType" :label="$t('daoChuFangShi')" v-if="user.companyId == '936'">
                     <div class="exportReportRadio">
                         <el-radio v-model="exportType" :label="0">{{ $t('wanZhengDaoChu') }}</el-radio>
                         <el-radio v-model="exportType" :label="1">{{ $t('jingJianDaoChu') }}</el-radio>
                         <el-tooltip effect="dark" v-if="user.companyId == '936'" :content="$t('jingJianRiBaoBuHanGongZuoShiXiangHeShenPiXinXiShuJuLiangGengXiaoDaoChuGengKuai')" placement="top-start">
                             <i class="el-icon-question"></i>
                         </el-tooltip>
-                        <el-tooltip effect="dark" v-if="user.companyId == '1071'" content="精简日报不含填写审核节点信息和周总结" placement="top-start">
+                        <!-- <el-tooltip effect="dark" v-if="user.companyId == '1071'" content="精简日报不含填写审核节点信息和周总结" placement="top-start">
                             <i class="el-icon-question"></i>
-                        </el-tooltip>
+                        </el-tooltip> -->
                     </div>
                 </el-form-item>
             </el-form>
@@ -1773,7 +1776,8 @@
             >
             <template slot-scope="scope">
                     <span v-if="scope.row.status == '待提交'" style="color:orange" >{{ scope.row.status }}</span>
-                    <span v-else-if="scope.row.status == '已驳回'" style="color:red" >{{ scope.row.status }}</span>
+                    <span v-else-if="scope.row.status == '驳回'" style="color:red" >{{ scope.row.status }}</span>
+                    <span v-else-if="scope.row.status == '请假'" style="color:green" >{{ scope.row.status }}</span>
                     <span v-else >{{ scope.row.status }}</span>
                 </template>
             </el-table-column>
@@ -6260,6 +6264,10 @@
                 if(this.exportParam.plate) {
                     param.plate = this.exportParam.plate
                 }
+                //物奇直接以精简模式导出
+                if (this.user.companyId == '1071') {
+                    param.exportType = 1;
+                }
                 param.stateKey = this.stateKey
                 // param.departmentId = this.user.departmentId
                 this.http.post(this.port.report.export, param,
@@ -6706,6 +6714,7 @@
                             this.workForm = {
                                 ...copyWorkForm
                             }
+                            if (candelete) this.reportCanDelete=candelete;
                         } else {
                             let copyWorkForm = {
                                 createDate: this.workForm.createDate,