浏览代码

1.新增项目核算登记

WoNiu 4 年之前
父节点
当前提交
9c5c12a943

+ 4 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunGroupProjectDao.java

@@ -2,6 +2,8 @@ package com.galaxis.manatee.dao;
 
 import com.galaxis.capsule.util.GalaxisRepository;
 import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunGroupProjectDO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Repository;
 
 /**
@@ -11,4 +13,6 @@ import org.springframework.stereotype.Repository;
  */
 @Repository
 public interface ChuanyunGroupProjectDao extends GalaxisRepository<ChuanyunGroupProjectDO,String> {
+
+    Page<ChuanyunGroupProjectDO> findAllByStatus(int status,Pageable pageable);
 }

+ 18 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunLaborCostDao.java

@@ -0,0 +1,18 @@
+package com.galaxis.manatee.dao;
+
+import com.galaxis.capsule.util.GalaxisRepository;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLaborCostDO;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ChuanyunLaborCostDao extends GalaxisRepository<ChuanyunLaborCostDO,String> {
+
+    @Query(value="SELECT project_id AS object_id,chuanyun_user.name,(SUM(chuanyun_day_log.hours_worked)/184)*chuanyun_payroll.wages_payable AS owner_payroll,chuanyun_user.object_id AS userId"+
+    " FROM chuanyun_project LEFT JOIN chuanyun_day_log ON chuanyun_day_log.project_id = chuanyun_project.object_id LEFT JOIN chuanyun_log ON chuanyun_log.object_id = chuanyun_day_log.parent_object_id LEFT JOIN chuanyun_user ON chuanyun_user.object_id = chuanyun_log.user_id"+
+            " LEFT JOIN chuanyun_payroll ON chuanyun_payroll.employee_id = chuanyun_user.employee_number AND DATE_FORMAT(chuanyun_day_log.day_log_date,'%Y-%m') = DATE_FORMAT(chuanyun_payroll.period,'%Y-%m')"+
+            " WHERE project_id = ? GROUP BY chuanyun_day_log.project_id,chuanyun_log.user_id,DATE_FORMAT(chuanyun_day_log.day_log_date,'%Y-%m')",nativeQuery = true)
+    List<ChuanyunLaborCostDO> findLaborCost(String projectCode);
+}

+ 41 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunPersonDaysDao.java

@@ -0,0 +1,41 @@
+package com.galaxis.manatee.dao;
+
+
+import com.galaxis.capsule.util.GalaxisRepository;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunLaborCostDO;
+import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunPersonDaysDO;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ChuanyunPersonDaysDao extends GalaxisRepository<ChuanyunPersonDaysDO,String> {
+
+//    @Query(value="SELECT total.project_id AS object_id,SUM((self_work_hour.hours_worked / total.total_hour) * 8) / 8 AS person_days FROM(SELECT project_id,SUM(chuanyun_day_log.hours_worked)AS total_hour,user_id FROM chuanyun_project"+
+//            " LEFT JOIN chuanyun_day_log ON chuanyun_day_log.project_id = chuanyun_project.object_id LEFT JOIN chuanyun_log ON chuanyun_log.object_id = chuanyun_day_log.parent_object_id"+
+//            " GROUP BY chuanyun_project.object_id) total LEFT JOIN (SELECT chuanyun_day_log.hours_worked,chuanyun_log.user_id,chuanyun_day_log.project_id,chuanyun_day_log.project_type"+
+//            " FROM chuanyun_day_log LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id WHERE chuanyun_day_log.project_type NOT IN ('生产项目','管理项目')"+
+//            "GROUP BY chuanyun_day_log.project_id,chuanyun_log.user_id,chuanyun_day_log.day_log_date) self_work_hour ON self_work_hour.user_id = total.user_id WHERE total.project_id =?",nativeQuery = true)
+//    ChuanyunPersonDaysDO getPersonDays(String projectId);
+
+    /**
+     * 项目每人每天工时
+     * @param projectId
+     * @return
+     */
+    @Query(value="SELECT chuanyun_day_log.hours_worked,chuanyun_log.user_id,chuanyun_day_log.project_id AS object_id,chuanyun_day_log.project_type FROM chuanyun_day_log"+
+            "\tLEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id WHERE project_id = ?"+
+            "\tGROUP BY chuanyun_day_log.project_id,chuanyun_log.user_id,chuanyun_day_log.day_log_date",nativeQuery = true)
+    List<ChuanyunPersonDaysDO> getSelfWorkHour(String projectId);
+
+    /**
+     * 项目总工时
+     * @param projectId
+     * @return
+     */
+    @Query(value="SELECT SUM(chuanyun_day_log.hours_worked) AS hours_worked,chuanyun_day_log.project_id AS object_id,chuanyun_day_log.project_type FROM chuanyun_day_log"+
+            " LEFT JOIN chuanyun_log ON chuanyun_day_log.parent_object_id = chuanyun_log.object_id WHERE project_id = ? GROUP BY chuanyun_day_log.project_id",nativeQuery = true)
+    ChuanyunPersonDaysDO getTotalWorkHour(String projectId);
+
+}

+ 4 - 0
src/main/java/com/galaxis/manatee/dao/ChuanyunReimbursementDao.java

@@ -6,6 +6,8 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 
 /**
  * @author zcj
@@ -22,4 +24,6 @@ public interface ChuanyunReimbursementDao extends GalaxisRepository<ChuanyunReim
      * @return  列表
      */
     Page<ChuanyunReimbursementDO> findAllByErpFlag(Integer erpFlag, Pageable pageable);
+
+    List<ChuanyunReimbursementDO> findAllByGroupProjectId(String projectId);
 }

+ 55 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunAdjustAccountDO.java

@@ -0,0 +1,55 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+@Slf4j
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Entity(name = "CHUANYUN_ADJUSTACCOUNT")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunAdjustAccountDO extends BasicDO{
+
+    /**
+     * 表名
+     */
+    public static final String SCHEMA_CODE ="D0017892ee29d6120484e65b033773717c8548f";
+
+    @JsonProperty("F0000002")
+    private String projectCode;
+
+
+    /**
+     * 核算实施人天
+     */
+    @JsonProperty("F0000003")
+    private BigDecimal personDays;
+
+    /**
+     * 核算实施人力成本
+     */
+    @JsonProperty("F0000004")
+    private BigDecimal laborCost;
+
+    /**
+     * 核算实施费用
+     */
+    @JsonProperty("F0000005")
+    private BigDecimal implementationCosts;
+
+    /**
+     *核算实施总成本
+     */
+    @JsonProperty("F0000006")
+    private BigDecimal totalImplementationCosts;
+
+
+
+}

+ 24 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunLaborCostDO.java

@@ -0,0 +1,24 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.math.BigDecimal;
+
+@Slf4j
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunLaborCostDO {
+
+    @Id
+    private String objectId;
+
+    private BigDecimal ownerPayroll;
+
+}

+ 22 - 0
src/main/java/com/galaxis/manatee/entity/chuanyun/data/object/ChuanyunPersonDaysDO.java

@@ -0,0 +1,22 @@
+package com.galaxis.manatee.entity.chuanyun.data.object;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import java.math.BigDecimal;
+
+@Slf4j
+@Data
+@Entity
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ChuanyunPersonDaysDO {
+
+    @Id
+    private String objectId;
+
+    private BigDecimal hoursWorked;
+}

+ 109 - 9
src/main/java/com/galaxis/manatee/task/ChuanyunProjectScheduledTask.java

@@ -1,21 +1,21 @@
 package com.galaxis.manatee.task;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.galaxis.manatee.dao.ChuanyunPaymentReceiveDao;
-import com.galaxis.manatee.dao.ChuanyunProjectCashFlowDao;
-import com.galaxis.manatee.dao.ChuanyunPurCostDao;
-import com.galaxis.manatee.dao.ChuanyunSaleContractDao;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunPaymentReceiveDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunProjectCashFlowDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunPurCostDO;
-import com.galaxis.manatee.entity.chuanyun.data.object.ChuanyunSaleContractDO;
+import com.galaxis.manatee.dao.*;
+import com.galaxis.manatee.entity.chuanyun.data.object.*;
+import com.galaxis.manatee.entity.chuanyun.dto.ChuanyunSaveDTO;
 import com.galaxis.manatee.entity.chuanyun.dto.Filter;
+import com.galaxis.manatee.exception.BigSizeException;
 import com.galaxis.manatee.manager.ChuanYunManager;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -33,13 +33,23 @@ public class ChuanyunProjectScheduledTask {
     private final ChuanyunPaymentReceiveDao chuanyunPaymentReceiveDao;
     private final ChuanyunPurCostDao chuanyunPurCostDao;
     private final ChuanyunProjectCashFlowDao chuanyunProjectCashFlowDao;
+    private final ChuanyunGroupProjectDao chuanyunGroupProjectDao;
+    private final ChuanyunReimbursementDao chuanyunReimbursementDao;
+    private final ChuanyunLaborCostDao chuanyunLaborCostDao;
+    private final ChuanyunPersonDaysDao chuanyunPersonDaysDao;
+    private final ChuanyunProjectDao chuanyunProjectDao;
 
-    public ChuanyunProjectScheduledTask(ChuanYunManager chuanYunManager, ChuanyunSaleContractDao chuanyunSaleContractDao, ChuanyunPaymentReceiveDao chuanyunPaymentReceiveDao, ChuanyunPurCostDao chuanyunPurCostDao, ChuanyunProjectCashFlowDao chuanyunProjectCashFlowDao) {
+    public ChuanyunProjectScheduledTask(ChuanYunManager chuanYunManager, ChuanyunSaleContractDao chuanyunSaleContractDao, ChuanyunPaymentReceiveDao chuanyunPaymentReceiveDao, ChuanyunPurCostDao chuanyunPurCostDao, ChuanyunProjectCashFlowDao chuanyunProjectCashFlowDao, ChuanyunGroupProjectDao chuanyunGroupProjectDao, ChuanyunReimbursementDao chuanyunReimbursementDao, ChuanyunLaborCostDao chuanyunLaborCostDao, ChuanyunPersonDaysDao chuanyunPersonDaysDao, ChuanyunProjectDao chuanyunProjectDao) {
         this.chuanYunManager = chuanYunManager;
         this.chuanyunSaleContractDao = chuanyunSaleContractDao;
         this.chuanyunPaymentReceiveDao = chuanyunPaymentReceiveDao;
         this.chuanyunPurCostDao = chuanyunPurCostDao;
         this.chuanyunProjectCashFlowDao = chuanyunProjectCashFlowDao;
+        this.chuanyunGroupProjectDao = chuanyunGroupProjectDao;
+        this.chuanyunReimbursementDao = chuanyunReimbursementDao;
+        this.chuanyunLaborCostDao = chuanyunLaborCostDao;
+        this.chuanyunPersonDaysDao = chuanyunPersonDaysDao;
+        this.chuanyunProjectDao = chuanyunProjectDao;
     }
 
     /**
@@ -158,6 +168,76 @@ public class ChuanyunProjectScheduledTask {
         log.info("项目物料成本保存"+totalCount);
     }
 
+    @Scheduled(fixedDelay = 3600000L)
+    private void saveAdjustAccount() {
+        var objectMapper=new ObjectMapper();
+        var flag = true;
+        var pageSize = 20;
+        var page = 0;
+        while (flag) {
+            var pageable= PageRequest.of(page,pageSize);
+            var chuanyunGroupProjectDOS = chuanyunProjectDao.findAllByIsCreate(null,pageable);
+            if (page<=chuanyunGroupProjectDOS.getTotalPages()){
+                page += 1;
+            }else {
+                flag = false;
+                break;
+            }
+            List<ChuanyunProjectDO> list = chuanyunGroupProjectDOS.getContent();
+            list.forEach(chuanyunProjectDO -> {
+                ChuanyunAdjustAccountDO chuanyunAdjustAccountDO = new ChuanyunAdjustAccountDO();
+                //项目号
+                chuanyunAdjustAccountDO.setProjectCode(chuanyunProjectDO.getProjectCode());
+                //核算实施费用
+                BigDecimal money = new BigDecimal(0);
+                List<ChuanyunReimbursementDO> list1 = chuanyunReimbursementDao.findAllByGroupProjectId(chuanyunProjectDO.getObjectId());
+                if (list1 != null) {
+                   for (ChuanyunReimbursementDO chuanyunReimbursementDO : list1) {
+                       money = money.add(chuanyunReimbursementDO.getAmount());
+                   }
+                }
+                chuanyunAdjustAccountDO.setImplementationCosts(money);
+                //人力成本
+                BigDecimal laborCost = new BigDecimal(0);
+                List<ChuanyunLaborCostDO> recordlist = chuanyunLaborCostDao.findLaborCost(chuanyunProjectDO.getObjectId());
+                //单个项目每人每月累计和
+                for (ChuanyunLaborCostDO chuanyunLaborCostDO : recordlist) {
+                    if (chuanyunLaborCostDO.getOwnerPayroll()!=null) {
+                        laborCost = laborCost.add(chuanyunLaborCostDO.getOwnerPayroll());
+                    }
+                }
+                chuanyunAdjustAccountDO.setLaborCost(laborCost);
+                //核算人天
+                chuanyunAdjustAccountDO.setPersonDays(personDays(chuanyunProjectDO.getObjectId()));
+                //新增
+                if (!chuanyunAdjustAccountDO.getPersonDays().toString().equals("0")){
+                    try {
+                        List<String> macthers = new ArrayList<>();
+                        macthers.add("F0000002_2,"+chuanyunProjectDO.getProjectCode());
+                        var filter= Filter.instance(0,1,true,"And",macthers);
+                        var chuanyunFindAllResponse=chuanYunManager.findAll(ChuanyunAdjustAccountDO.SCHEMA_CODE,filter);
+                        var adjustString=objectMapper.writeValueAsString(chuanyunAdjustAccountDO);
+                        ChuanyunSaveDTO chuanyunSaveDTO;
+                        if (chuanyunFindAllResponse.getReturnData() != null) {
+                            List<ChuanyunAdjustAccountDO> result=objectMapper.convertValue(chuanyunFindAllResponse.getReturnData().getBizObjectArray(), new TypeReference<>(){});
+                            ChuanyunAdjustAccountDO chuanyunAdjustAccountDO1 = result.get(0);
+                            chuanyunSaveDTO = chuanYunManager.update(ChuanyunAdjustAccountDO.SCHEMA_CODE,chuanyunAdjustAccountDO1.getObjectId(),adjustString);
+                        }else  {
+                            chuanyunSaveDTO = chuanYunManager.save(ChuanyunAdjustAccountDO.SCHEMA_CODE,adjustString,true);
+                        }
+                        if(chuanyunSaveDTO.getSuccessful()){
+                            log.info("新增项目核算登记成功");
+                        }else{
+                            log.warn("新增项目核算登记失败");
+                        }
+                    } catch (JsonProcessingException | BigSizeException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+    }
+
     /**
      * 更新销售合同回款数据
      */
@@ -197,4 +277,24 @@ public class ChuanyunProjectScheduledTask {
         }
         log.info("项目销售合同回款信息保存保存"+totalCount);
     }
+
+    /**
+     * 计算人天
+     * @param projectId
+     * @return
+     */
+    private BigDecimal personDays(String projectId){
+        BigDecimal standard = new BigDecimal(8);
+        BigDecimal personDays = new BigDecimal(0);
+        //项目每人每天工时
+       List<ChuanyunPersonDaysDO> selfWorkHourList = chuanyunPersonDaysDao.getSelfWorkHour(projectId);
+       for (ChuanyunPersonDaysDO chuanyunPersonDaysDO : selfWorkHourList) {
+           //项目总工时
+           ChuanyunPersonDaysDO totalWorkHour = chuanyunPersonDaysDao.getTotalWorkHour(projectId);
+           BigDecimal totalDays = (chuanyunPersonDaysDO.getHoursWorked().divide(totalWorkHour.getHoursWorked(), 2, BigDecimal.ROUND_HALF_UP)).multiply(standard);
+           personDays= personDays.add(totalDays);
+       }
+       return personDays.divide(standard);
+
+    }
 }