Преглед на файлове

财务部,导入erp后,比对物料对应配置规则下的erp数量与审定数量,修改备注

lem преди 4 години
родител
ревизия
8a80139ce0
променени са 15 файла, в които са добавени 1369 реда и са изтрити 57 реда
  1. 5 1
      src/main/java/com/jeeplus/modules/sg/financial/erpcredit/util/ExportUtilCalculate.java
  2. 77 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/entity/Corresponding.java
  3. 25 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/entity/ProjectBudget.java
  4. 55 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/CorrespondingMapper.java
  5. 199 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/CorrespondingMapper.xml
  6. 6 3
      src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/DonorMaterialMapper.xml
  7. 16 2
      src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/ProjectBudgetMapper.xml
  8. 108 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/service/CorrespondingService.java
  9. 66 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/service/DonorMaterialService.java
  10. 238 0
      src/main/java/com/jeeplus/modules/sg/financial/settlement/web/CorrespondingController.java
  11. 75 43
      src/main/java/com/jeeplus/modules/sg/financial/settlement/web/ProjectBudgetController.java
  12. 139 0
      src/main/webapp/webpage/modules/sg/financial/settlement/correspondingForm.jsp
  13. 255 0
      src/main/webapp/webpage/modules/sg/financial/settlement/correspondingList.js
  14. 97 0
      src/main/webapp/webpage/modules/sg/financial/settlement/correspondingList.jsp
  15. 8 8
      src/main/webapp/webpage/modules/sg/financial/settlement/financeBudgetForm.jsp

+ 5 - 1
src/main/java/com/jeeplus/modules/sg/financial/erpcredit/util/ExportUtilCalculate.java

@@ -983,7 +983,11 @@ public class ExportUtilCalculate {
                     if (null!=schedule.getActualIntallProject()){
                         installALL=Double.valueOf(schedule.getActualIntallProject());//安装费用
                     }
-                    otherAll=Double.valueOf(schedule.getActualOtherFee());
+                    String actualOtherFee = schedule.getActualOtherFee();
+                    if (null == actualOtherFee) {
+                        actualOtherFee = "0";
+                    }
+                    otherAll = Double.valueOf(actualOtherFee);
                     installLine=0.0;//线路表安装费用
                     standFeeLine=0.0;//线路表分摊费用
                     installEqu = 0.0;//设备安装费用

+ 77 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/entity/Corresponding.java

@@ -0,0 +1,77 @@
+package com.jeeplus.modules.sg.financial.settlement.entity;
+
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.core.persistence.DataEntity;
+
+import java.util.List;
+
+/**
+ * 物料对应配置实体类
+ * */
+public class Corresponding extends DataEntity<Corresponding> {
+    /**
+     * 序号
+     */
+    private String serialNumber;
+    /**
+     * 物料编码
+     */
+    private String materialCode;
+    /**
+     * 物料类型
+     */
+    private String materialType;
+    /**
+     * 物料描述
+     */
+    private String materialDescription;
+
+    /**
+     * 字类对应数据
+     */
+    private List<Corresponding> childList;
+
+    @ExcelField(title="序号", align=2, sort=1)
+    public String getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(String serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
+    @ExcelField(title="物料编码", align=2, sort=2)
+    public String getMaterialCode() {
+        return materialCode;
+    }
+
+    public void setMaterialCode(String materialCode) {
+        this.materialCode = materialCode;
+    }
+
+    @ExcelField(title="物料类型", align=2, sort=3)
+    public String getMaterialType() {
+        return materialType;
+    }
+
+    public void setMaterialType(String materialType) {
+        this.materialType = materialType;
+    }
+
+    @ExcelField(title="物料描述", align=2, sort=4)
+    public String getMaterialDescription() {
+        return materialDescription;
+    }
+
+    public void setMaterialDescription(String materialDescription) {
+        this.materialDescription = materialDescription;
+    }
+
+    public List<Corresponding> getChildList() {
+        return childList;
+    }
+
+    public void setChildList(List<Corresponding> childList) {
+        this.childList = childList;
+    }
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/entity/ProjectBudget.java

@@ -96,10 +96,18 @@ public class ProjectBudget extends DataEntity<ProjectBudget> {
      * */
     private Double designTypicalDiscount;
     /**
+     * 设计含税税率
+     * */
+    private Double designTaxRate;
+    /**
      * 监理合同折扣
      * */
     private Double supervisorContractDiscount;
     /**
+     * 监理含税税率
+     */
+    private Double supervisorTaxRate;
+    /**
      * 项目类型
      * */
     private String projectType;
@@ -304,6 +312,14 @@ public class ProjectBudget extends DataEntity<ProjectBudget> {
         this.designTypicalDiscount = designTypicalDiscount;
     }
 
+    public Double getDesignTaxRate() {
+        return designTaxRate;
+    }
+
+    public void setDesignTaxRate(Double designTaxRate) {
+        this.designTaxRate = designTaxRate;
+    }
+
     public Double getSupervisorContractDiscount() {
         return supervisorContractDiscount;
     }
@@ -312,6 +328,15 @@ public class ProjectBudget extends DataEntity<ProjectBudget> {
         this.supervisorContractDiscount = supervisorContractDiscount;
     }
 
+    public Double getSupervisorTaxRate() {
+        return supervisorTaxRate;
+    }
+
+    public void setSupervisorTaxRate(Double supervisorTaxRate) {
+        this.supervisorTaxRate = supervisorTaxRate;
+    }
+
+
     public String getProjectType() {
         return projectType;
     }

+ 55 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/CorrespondingMapper.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.sg.financial.settlement.mapper;
+
+import com.jeeplus.core.persistence.BaseMapper;
+import com.jeeplus.core.persistence.annotation.MyBatisMapper;
+import com.jeeplus.modules.sg.financial.settlement.entity.Corresponding;
+import com.jeeplus.modules.test.one.dialog.entity.Leave1;
+
+import java.util.List;
+
+/**
+ * 物料对应配置MAPPER接口
+ * @author user3
+ * @version 2021-04-22
+ */
+@MyBatisMapper
+public interface CorrespondingMapper extends BaseMapper<Corresponding> {
+    /**
+     * 通过序号,物料编码
+     * */
+    Integer findChild(Corresponding entity);
+
+    /**
+     * 插入字类数据
+     * */
+    void insertChild(Corresponding entity);
+
+    /**
+     * 更新字类数据
+     * */
+    void updateChild(Corresponding entity);
+
+    /**
+     * 字类数据集合
+     * @param entity 查询条件
+     * */
+    List<Corresponding> findChildList(Corresponding entity);
+
+    /**
+     * 删除字类
+     * */
+    void deleteChild(Corresponding entity);
+
+    /**
+     * 删除字类
+     * */
+    void deleteAllChild(Corresponding entity);
+
+    /**
+     * 通过序号查询父类是否已经存在
+     * */
+    Corresponding isNull(Corresponding entity);
+}

+ 199 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/CorrespondingMapper.xml

@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.modules.sg.financial.settlement.mapper.CorrespondingMapper">
+    
+	<sql id="correspondingColumns">
+		a.id AS "id",
+		a.serialNumber AS "serialNumber",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag"
+	</sql>
+
+	<sql id="childColumns">
+		a.id AS "id",
+		a.serialNumber AS "serialNumber",
+		a.materialCode AS "materialCode",
+		a.materialType AS "materialType",
+		a.materialDescription AS "materialDescription",
+		a.create_by AS "createBy.id",
+		a.create_date AS "createDate",
+		a.update_by AS "updateBy.id",
+		a.update_date AS "updateDate",
+		a.remarks AS "remarks",
+		a.del_flag AS "delFlag"
+	</sql>
+	<delete id="deleteChild">
+		DELETE FROM finance_corresponding_detail
+		WHERE id = #{id}
+	</delete>
+	<delete id="deleteAllChild">
+		DELETE FROM finance_corresponding_detail
+		WHERE serialNumber = #{serialNumber}
+	</delete>
+
+
+	<select id="get" resultType="Corresponding" >
+		SELECT 
+			<include refid="correspondingColumns"/>
+		FROM finance_corresponding a
+		WHERE a.id = #{id}
+	</select>
+	
+	<select id="findList" resultType="Corresponding" >
+		SELECT 
+			<include refid="correspondingColumns"/>
+		FROM finance_corresponding a
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+
+	<select id="findChildList" resultType="com.jeeplus.modules.sg.financial.settlement.entity.Corresponding">
+		SELECT
+		<include refid="childColumns"/>
+		FROM finance_corresponding_detail a
+		<where>
+		<if test="serialNumber!=null and serialNumber != ''">
+			a.serialNumber = #{serialNumber}
+		</if>
+		</where>
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<select id="findAllList" resultType="Corresponding" >
+		SELECT
+		<include refid="correspondingColumns"/>
+		FROM finance_corresponding a
+		<where>
+			a.del_flag = #{DEL_FLAG_NORMAL}
+			${dataScope}
+		</where>		
+		<choose>
+			<when test="page !=null and page.orderBy != null and page.orderBy != ''">
+				ORDER BY ${page.orderBy}
+			</when>
+			<otherwise>
+				ORDER BY a.update_date DESC
+			</otherwise>
+		</choose>
+	</select>
+	
+	<insert id="insert">
+		INSERT INTO finance_corresponding(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+			serialNumber
+		) VALUES (
+			#{id},
+			#{createBy.id},
+			#{createDate},
+			#{updateBy.id},
+			#{updateDate},
+			#{remarks},
+			#{delFlag},
+			#{serialNumber}
+		)
+	</insert>
+	<insert id="insertChild">
+		INSERT INTO finance_corresponding_detail(
+			id,
+			create_by,
+			create_date,
+			update_by,
+			update_date,
+			remarks,
+			del_flag,
+			serialNumber,
+			materialCode,
+			materialType,
+			materialDescription
+		) VALUES (
+					 #{id},
+					 #{createBy.id},
+					 #{createDate},
+					 #{updateBy.id},
+					 #{updateDate},
+					 #{remarks},
+					 #{delFlag},
+					 #{serialNumber},
+					#{materialCode},
+ 					#{materialType},
+					#{materialDescription}
+				 )
+	</insert>
+
+	<update id="update">
+		UPDATE finance_corresponding SET
+			serialNumber = #{serialNumber},
+			update_by = #{updateBy.id},
+			update_date = #{updateDate},
+			remarks = #{remarks}
+		WHERE id = #{id}
+	</update>
+	
+	
+	<!--物理删除-->
+	<update id="delete">
+		DELETE FROM finance_corresponding
+		WHERE id = #{id}
+	</update>
+	
+	<!--逻辑删除-->
+	<update id="deleteByLogic">
+		UPDATE finance_corresponding SET
+			del_flag = #{DEL_FLAG_DELETE}
+		WHERE id = #{id}
+	</update>
+	<update id="updateChild">
+		UPDATE finance_corresponding_detail SET
+			 serialNumber = #{serialNumber},
+			 materialCode = #{materialCode},
+		 	materialType = #{materialType},
+			materialDescription = #{materialDescription},
+			 update_by = #{updateBy.id},
+			 update_date = #{updateDate},
+			 remarks = #{remarks}
+		WHERE id = #{id}
+	</update>
+
+
+	<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
+	<select id="findUniqueByProperty" resultType="corresponding" statementType="STATEMENT">
+		select * FROM test_leave  where ${propertyName} = '${value}'
+	</select>
+
+	<select id="findChild" resultType="java.lang.Integer">
+		select count(id)
+		from finance_corresponding_detail
+		where serialNumber = #{serialNumber}
+		  and materialCode = #{materialCode}
+		  and materialType = #{materialType}
+		  and materialDescription = #{materialDescription}
+	</select>
+	<select id="isNull" resultType="com.jeeplus.modules.sg.financial.settlement.entity.Corresponding">
+	select serialNumber from finance_corresponding where serialNumber = #{serialNumber}
+	</select>
+
+
+</mapper>

+ 6 - 3
src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/DonorMaterialMapper.xml

@@ -239,9 +239,12 @@
 	</select>
 
 	<select id="findById" resultType="com.jeeplus.modules.sg.financial.settlement.entity.DonorMaterial">
-		select project_id,
-			   material_code,
-			   material_name,
+		select id,
+		       project_id,
+			   material_code as "materialCode",
+			   material_name as "materialName",
+		       material_type as "materialType",
+		       materail_describe as "materialDescribe",
 			   examined_num,
 			   erp_num,
 		       remarks

+ 16 - 2
src/main/java/com/jeeplus/modules/sg/financial/settlement/mapper/xml/ProjectBudgetMapper.xml

@@ -31,7 +31,9 @@
 		administration_cost as "administrationCost",
 		design_contract_discount as "designContractDiscount",
 		design_typical_discount as "designTypicalDiscount",
+		design_tax_rate as "designTaxRate",
 		supervisor_contract_discount as "supervisorContractDiscount",
+		supervisor_tax_rate as "supervisorTaxRate",
 		project_type as "projectType"
 	</sql>
 
@@ -126,7 +128,9 @@
 			administration_cost,
 			design_contract_discount,
 			design_typical_discount,
+		    design_tax_rate,
 			supervisor_contract_discount,
+		   supervisor_tax_rate,
 			project_type
 		) VALUES (
 		    #{id},
@@ -157,7 +161,9 @@
 			#{administrationCost},
 			#{designContractDiscount},
 			#{designTypicalDiscount},
+			#{designTaxRate},
 			#{supervisorContractDiscount},
+		  	#{supervisorTaxRate},
 			#{projectType}
 		)
 	</insert>
@@ -191,7 +197,9 @@
 			administration_cost,
 			design_contract_discount,
 			design_typical_discount,
+		   design_tax_rate,
 			supervisor_contract_discount,
+		   supervisor_tax_rate,
 			project_type
 		) VALUES
 		<foreach collection="list" item="item" index="index" separator="," >
@@ -224,7 +232,9 @@
 			 #{item.administrationCost},
 			 #{item.designContractDiscount},
 			 #{item.designTypicalDiscount},
+			 #{item.designTaxRate},
 			 #{item.supervisorContractDiscount},
+			 #{item.supervisorTaxRate},
 			 #{item.projectType}
 	 		)
 		</foreach>
@@ -234,7 +244,7 @@
 	<update id="update">
 		UPDATE finance_project_budget SET
 		  update_by = #{updateBy.id},
-		  update_date = #{createDate},
+		  update_date = #{updateDate},
 		  project_name = #{projectName},
 		  design_unit = #{designUnit},
 		  construction_unit = #{constructionUnit},
@@ -255,7 +265,9 @@
 		  administration_cost = #{administrationCost},
 		  design_contract_discount = #{designContractDiscount},
 		  design_typical_discount = #{designTypicalDiscount},
+		  design_tax_rate = #{designTaxRate},
 		  supervisor_contract_discount = #{supervisorContractDiscount},
+		  supervisor_tax_rate = #{supervisorTaxRate},
 		  project_type = #{projectType},
 		  donor_material_check = '0',
 		  construction_cost_check = '0',
@@ -282,7 +294,7 @@
 		<foreach collection="list" item="item" index="index">
 			update finance_project_budget set
 			update_by = #{item.updateBy.id},
-			update_date = #{item.createDate},
+			update_date = #{item.updateDate},
 			project_name = #{item.projectName},
 			design_unit = #{item.designUnit},
 			construction_unit = #{item.constructionUnit},
@@ -303,7 +315,9 @@
 			administration_cost = #{item.administrationCost},
 			design_contract_discount = #{item.designContractDiscount},
 			design_typical_discount = #{item.designTypicalDiscount},
+			design_tax_rate = #{item.designTaxRate},
 			supervisor_contract_discount = #{item.supervisorContractDiscount},
+			supervisor_tax_rate = #{item.supervisorTaxRate},
 			project_type = #{item.projectType},
 			donor_material_check = '0',
 			construction_cost_check = '0',

+ 108 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/service/CorrespondingService.java

@@ -0,0 +1,108 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.sg.financial.settlement.service;
+
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.service.CrudService;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformation;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformationChild;
+import com.jeeplus.modules.sg.financial.settlement.entity.Corresponding;
+import com.jeeplus.modules.sg.financial.settlement.mapper.CorrespondingMapper;
+import com.jeeplus.modules.test.one.dialog.entity.Leave1;
+import com.jeeplus.modules.test.one.dialog.mapper.Leave1Mapper;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 物料对应配置Service
+ * @author user3
+ * @version 2021-04-22
+ */
+@Service
+@Transactional(readOnly = true)
+public class CorrespondingService extends CrudService<CorrespondingMapper, Corresponding> {
+
+	public Corresponding get(String id) {
+		Corresponding corresponding = super.get(id);
+		corresponding.setChildList(mapper.findChildList(corresponding));
+		return corresponding;
+	}
+	
+	public List<Corresponding> findList(Corresponding entity) {
+		return super.findList(entity);
+	}
+	
+	public Page<Corresponding> findPage(Page<Corresponding> page, Corresponding entity) {
+		return super.findPage(page, entity);
+	}
+
+	public List<Corresponding> findChildList(Corresponding entity) {
+		dataRuleFilter(entity);
+		return mapper.findChildList(entity);
+	}
+
+	public Page<Corresponding> findChildPage(Page<Corresponding> page, Corresponding entity) {
+		dataRuleFilter(entity);
+		entity.setPage(page);
+		page.setList(mapper.findChildList(entity));
+		return page;
+	}
+
+	@Transactional(readOnly = false)
+	public void insert(Corresponding entity) {
+		entity.preInsert();
+		mapper.insert(entity);
+	}
+
+	@Transactional(readOnly = false)
+	public void save(Corresponding entity) {
+		if (entity.getIsNewRecord()){
+			entity.preInsert();
+			mapper.insert(entity);
+		}else{
+			entity.preUpdate();
+			mapper.update(entity);
+		}
+		List<Corresponding> childList = entity.getChildList();
+		for (Corresponding c :
+				childList) {
+			c.setSerialNumber(entity.getSerialNumber());
+			if (BasicInformationChild.DEL_FLAG_NORMAL.equals(c.getDelFlag())) {
+				if (c.getIsNewRecord()) {
+					c.preInsert();
+					mapper.insertChild(c);
+				} else {
+					c.preUpdate();
+					mapper.updateChild(c);
+				}
+			} else {
+				mapper.deleteChild(c);
+			}
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void insertChild(Corresponding entity) {
+		entity.preInsert();
+		mapper.insertChild(entity);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(Corresponding entity) {
+		super.delete(entity);
+		mapper.deleteAllChild(entity);
+	}
+
+	@Transactional(readOnly = false)
+	public void deleteAllChild(Corresponding entity) {
+		mapper.deleteAllChild(entity);
+	}
+
+	public Corresponding isNull(Corresponding entity) {
+		return mapper.isNull(entity);
+	}
+}

+ 66 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/service/DonorMaterialService.java

@@ -8,9 +8,11 @@ import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.core.persistence.Page;
 import com.jeeplus.core.service.CrudService;
 import com.jeeplus.modules.sg.financial.erpcredit.entity.ErpCreditMaterial;
+import com.jeeplus.modules.sg.financial.settlement.entity.Corresponding;
 import com.jeeplus.modules.sg.financial.settlement.entity.CostCheck;
 import com.jeeplus.modules.sg.financial.settlement.entity.DonorMaterial;
 import com.jeeplus.modules.sg.financial.settlement.entity.ProjectBudget;
+import com.jeeplus.modules.sg.financial.settlement.mapper.CorrespondingMapper;
 import com.jeeplus.modules.sg.financial.settlement.mapper.CostCheckMapper;
 import com.jeeplus.modules.sg.financial.settlement.mapper.DonorMaterialMapper;
 import com.jeeplus.modules.sg.managementcenter.materialinfo.entity.MaterialInfo;
@@ -49,6 +51,9 @@ public class DonorMaterialService extends CrudService<DonorMaterialMapper, Donor
     @Autowired
     private DonorMaterialMapper donorMaterialMapper;
 
+    @Autowired
+    private CorrespondingMapper correspondingMapper;
+
     public static Map<String, CellStyle> styles;
 
     @Override
@@ -286,6 +291,8 @@ public class DonorMaterialService extends CrudService<DonorMaterialMapper, Donor
     /**/
     @Transactional(readOnly = false)
     public int verifyProjectMaterial(List<ErpCreditMaterial> list, String projectId,String projectName) {
+        //成本,资本项目完成后,查询出所有的物料配置信息
+        List<Corresponding> corrList = correspondingMapper.findList(new Corresponding());
         //返回值
         // 0:无甲供材数据
         //1:领料完成
@@ -313,6 +320,54 @@ public class DonorMaterialService extends CrudService<DonorMaterialMapper, Donor
                     donorMaterialMapper.updateErpOne(material, projectId);
                 }
             }
+            //查找所有的
+            byId = donorMaterialMapper.findById(projectId);
+            for (Corresponding c :
+                    corrList) {
+                BigDecimal erp = new BigDecimal("0.0");
+                BigDecimal exa = new BigDecimal("0.0");
+                List<DonorMaterial> useList = new ArrayList<>();
+                List<Corresponding> childList = correspondingMapper.findChildList(c);
+                for (Corresponding corr :
+                        childList) {
+                    for (DonorMaterial don :
+                            byId) {
+                        String materialCode = don.getMaterialCode();
+                        String materialDescribe = don.getMaterialDescribe();
+                        String materialType = don.getMaterialType();
+                        String materialCode1 = corr.getMaterialCode();
+                        String materialType1 = corr.getMaterialType();
+                        String materialDescription = corr.getMaterialDescription();
+                        if (null == materialType) {
+                            materialType = "";
+                        }
+                        if (null == materialType1) {
+                            materialType1 = "";
+                        }
+                        if (materialCode.equals(materialCode1) && materialType.equals(materialType1) && materialDescribe.equals(materialDescription)) {
+                            useList.add(don);
+                        }
+                    }
+                }
+                if (useList.size() > 0) {
+                    for (DonorMaterial use :
+                            useList) {
+                        BigDecimal bigDecimal = BigDecimal.valueOf(use.getErpNum());
+                        BigDecimal bigDecimal1 = BigDecimal.valueOf(use.getExaminedNum());
+                        erp.multiply(bigDecimal);
+                        exa.multiply(bigDecimal1);
+                    }
+                    //将相加的erp数量与审定数量比对,如果相等,将对应的物料
+                    int i = erp.compareTo(exa);
+                    if (i == 0) {
+                        for (DonorMaterial use :
+                                useList) {
+                            use.setRemarks("已完成领料");
+                            mapper.updateRemarks(use);
+                        }
+                    }
+                }
+            }
             byId = donorMaterialMapper.findById(projectId);
             for (DonorMaterial p :
                     byId) {
@@ -347,6 +402,14 @@ public class DonorMaterialService extends CrudService<DonorMaterialMapper, Donor
         return a;
     }
 
+
+    @Transactional(readOnly = false)
+    public int returnCorr(String projectId) {
+        int a = 0;
+
+        return a;
+    }
+
     @Transactional(readOnly = false)
     public void updateErpZero(String projectId) {
         donorMaterialMapper.updateErpZero(projectId);
@@ -366,4 +429,7 @@ public class DonorMaterialService extends CrudService<DonorMaterialMapper, Donor
     }
 
 
+    public List<DonorMaterial> findById(String projectId) {
+        return mapper.findById(projectId);
+    }
 }

+ 238 - 0
src/main/java/com/jeeplus/modules/sg/financial/settlement/web/CorrespondingController.java

@@ -0,0 +1,238 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.sg.financial.settlement.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.core.persistence.Page;
+import com.jeeplus.core.web.BaseController;
+import com.jeeplus.modules.filing.basicInformation.entity.BasicInformationChild;
+import com.jeeplus.modules.sg.financial.settlement.entity.Corresponding;
+import com.jeeplus.modules.sg.financial.settlement.service.CorrespondingService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 物料对应配置Controller
+ * @author user3
+ * @version 2021-04-22
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/finance/corresponding")
+public class CorrespondingController extends BaseController {
+
+	@Autowired
+	private CorrespondingService correspondingService;
+	
+	@ModelAttribute
+	public Corresponding get(@RequestParam(required=false) String id) {
+		Corresponding entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = correspondingService.get(id);
+		}
+		if (entity == null){
+			entity = new Corresponding();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 物料对应配置列表页面
+	 */
+	@RequiresPermissions("test:settlement:corresponding:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Corresponding corresponding, Model model) {
+		model.addAttribute("corresponding", corresponding);
+		return "modules/sg/financial/settlement/correspondingList";
+	}
+	
+		/**
+	 * 物料对应配置列表数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:list")
+	@RequestMapping(value = "data")
+	public Map<String, Object> data(Corresponding corresponding, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Corresponding> page = correspondingService.findPage(new Page<Corresponding>(request, response), corresponding); 
+		return getBootstrapData(page);
+	}
+
+	@ResponseBody
+	@RequestMapping(value = "detail")
+	public Map<String, Object> detail(Corresponding corresponding, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Corresponding> page = correspondingService.findChildPage(new Page<Corresponding>(request, response), corresponding);
+		return getBootstrapData(page);
+	}
+
+	/**
+	 * 查看,增加,编辑物料对应配置表单页面
+	 */
+	@RequiresPermissions(value={"test:settlement:corresponding:view","test:settlement:corresponding:add","test:settlement:corresponding:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Corresponding corresponding, Model model) {
+		model.addAttribute("corresponding", corresponding);
+		return "modules/sg/financial/settlement/correspondingForm";
+	}
+
+	/**
+	 * 保存物料对应配置
+	 */
+	@ResponseBody
+	@RequiresPermissions(value={"test:settlement:corresponding:add","test:settlement:corresponding:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public AjaxJson save(Corresponding corresponding, Model model) throws Exception{
+		AjaxJson j = new AjaxJson();
+		/**
+		 * 后台hibernate-validation插件校验
+		 */
+		List<Corresponding> childList = corresponding.getChildList();
+		if (null == childList || childList.size() <= 0) {
+			j.setSuccess(false);
+			j.setMsg("物料信息不能为空");
+			return j;
+		}
+		String errMsg = beanValidator(corresponding);
+		if (StringUtils.isNotBlank(errMsg)){
+			j.setSuccess(false);
+			j.setMsg(errMsg);
+			return j;
+		}
+		//新增或编辑表单保存
+		correspondingService.save(corresponding);//保存
+		j.setSuccess(true);
+		j.setMsg("保存物料对应配置成功");
+		return j;
+	}
+	
+	/**
+	 * 删除物料对应配置
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:del")
+	@RequestMapping(value = "delete")
+	public AjaxJson delete(Corresponding corresponding) {
+		AjaxJson j = new AjaxJson();
+		correspondingService.delete(corresponding);
+		j.setMsg("删除物料对应配置成功");
+		return j;
+	}
+	
+	/**
+	 * 批量删除物料对应配置
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:del")
+	@RequestMapping(value = "deleteAll")
+	public AjaxJson deleteAll(String ids) {
+		AjaxJson j = new AjaxJson();
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			correspondingService.delete(correspondingService.get(id));
+		}
+		j.setMsg("删除物料对应配置成功");
+		return j;
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:export")
+    @RequestMapping(value = "export")
+    public AjaxJson exportFile(Corresponding corresponding, HttpServletRequest request, HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "物料对应配置"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Corresponding> page = correspondingService.findChildPage(new Page<Corresponding>(request, response, -1), corresponding);
+    		new ExportExcel("物料对应配置", Corresponding.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		j.setSuccess(true);
+    		j.setMsg("导出成功!");
+    		return j;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导出物料对应配置记录失败!失败信息:"+e.getMessage());
+		}
+			return j;
+    }
+
+	/**
+	 * 导入Excel数据
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:import")
+    @RequestMapping(value = "import")
+   	public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
+		AjaxJson j = new AjaxJson();
+		try {
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Corresponding> list = ei.getDataList(Corresponding.class);
+			Map<String, List<Corresponding>> collect = list.stream().collect(Collectors.groupingBy(Corresponding::getSerialNumber));
+			List<Corresponding> insertList = new ArrayList<>();
+			for (String key : collect.keySet()) {
+				Corresponding corresponding = new Corresponding();
+				corresponding.setSerialNumber(key);
+				insertList.add(corresponding);
+			}
+			for (Corresponding c :
+					insertList) {
+				Corresponding aNull = correspondingService.isNull(c);
+				if (null == aNull) {
+					correspondingService.insert(c);
+				}
+				correspondingService.deleteAllChild(c);
+			}
+			for (Corresponding corresponding : list){
+				correspondingService.insertChild(corresponding);
+			}
+			j.setMsg( "已成功导入物料对应配置记录"+failureMsg);
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg("导入物料对应配置失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+	
+	/**
+	 * 下载导入物料对应配置数据模板
+	 */
+	@ResponseBody
+	@RequiresPermissions("test:settlement:corresponding:import")
+    @RequestMapping(value = "import/template")
+     public AjaxJson importFileTemplate(HttpServletResponse response) {
+		AjaxJson j = new AjaxJson();
+		try {
+            String fileName = "物料对应配置导入模板.xlsx";
+    		List<Corresponding> list = Lists.newArrayList(); 
+    		new ExportExcel("物料对应配置", Corresponding.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			j.setSuccess(false);
+			j.setMsg( "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return j;
+    }
+
+}

+ 75 - 43
src/main/java/com/jeeplus/modules/sg/financial/settlement/web/ProjectBudgetController.java

@@ -20,9 +20,11 @@ import com.jeeplus.modules.sg.financial.erpcredit.util.ErpInfo;
 import com.jeeplus.modules.sg.financial.erpcredit.util.ImportUtil;
 import com.jeeplus.modules.sg.financial.erpcredit.util.Result;
 import com.jeeplus.modules.sg.financial.erpcredit.util.ValidationUtils;
+import com.jeeplus.modules.sg.financial.settlement.entity.Corresponding;
 import com.jeeplus.modules.sg.financial.settlement.entity.CostCheck;
 import com.jeeplus.modules.sg.financial.settlement.entity.DonorMaterial;
 import com.jeeplus.modules.sg.financial.settlement.entity.ProjectBudget;
+import com.jeeplus.modules.sg.financial.settlement.service.CorrespondingService;
 import com.jeeplus.modules.sg.financial.settlement.service.CostCheckService;
 import com.jeeplus.modules.sg.financial.settlement.service.DonorMaterialService;
 import com.jeeplus.modules.sg.financial.settlement.service.ProjectBudgetService;
@@ -84,6 +86,9 @@ public class ProjectBudgetController extends BaseController {
     @Autowired
     private DonorMaterialService donorMaterialService;
 
+    @Autowired
+    private CorrespondingService correspondingService;
+
     @ModelAttribute
     public ProjectBudget get(@RequestParam(required = false) String id) {
         ProjectBudget entity = null;
@@ -203,26 +208,36 @@ public class ProjectBudgetController extends BaseController {
         double supervisorCost = getStaticDouble(projectBudget.getSupervisorCost());
         double designContractDiscount = getStaticDouble(projectBudget.getDesignContractDiscount());
         double designTypicalDiscount = getStaticDouble(projectBudget.getDesignTypicalDiscount());
+        double designTaxRate = getStaticDouble(projectBudget.getDesignTaxRate());
         double supervisorContractDiscount = getStaticDouble(projectBudget.getSupervisorContractDiscount());
+        double supervisorTaxRate = getStaticDouble(projectBudget.getSupervisorTaxRate());
         //使用bigDecimal初始化数值,计算防止精度丢失问题
         //设计费
-        BigDecimal designCostDecimal = new BigDecimal(designCost);
+        BigDecimal designCostDecimal = BigDecimal.valueOf(designCost);
         //监理费
-        BigDecimal supervisorCostDecimal = new BigDecimal(supervisorCost);
+        BigDecimal supervisorCostDecimal = BigDecimal.valueOf(supervisorCost);
         //设计合同折扣
-        BigDecimal desConDecimal = new BigDecimal(designContractDiscount);
+        BigDecimal desConDecimal = BigDecimal.valueOf(designContractDiscount);
         //设计典设折扣
-        BigDecimal desTypeDecimal = new BigDecimal(designTypicalDiscount);
+        BigDecimal desTypeDecimal = BigDecimal.valueOf(designTypicalDiscount);
+        //设计含税税率
+        BigDecimal desTaxRateDecimal = BigDecimal.valueOf(designTaxRate);
         //监理费合同折扣
-        BigDecimal supervisorDecimal = new BigDecimal(supervisorContractDiscount);
-        //计算项目设计费应付金额(设计费*设计合同折扣*设计典设折扣)两位小数
+        BigDecimal supervisorDecimal = BigDecimal.valueOf(supervisorContractDiscount);
+        //监理费含税税率
+        BigDecimal supTaxRateDecimal = BigDecimal.valueOf(supervisorTaxRate);
+
+        //计算项目设计费应付金额(设计费*设计合同折扣*设计典设折扣/设计含税税率)两位小数
         BigDecimal firResult = designCostDecimal.multiply(desConDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
         BigDecimal secResult = firResult.multiply(desTypeDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
-        projectBudget.setDesignFeePayable(secResult.toString());
-        //计算项目监理费应付金额(监理费*监理费合同折扣)两位小数
-        BigDecimal thirdResult = supervisorCostDecimal.multiply(supervisorDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
-        projectBudget.setSupervisionFeePayable(thirdResult.toString());
+        BigDecimal thirdResult = secResult.divide(desTaxRateDecimal,4,BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
+        projectBudget.setDesignFeePayable(thirdResult.toString());
+        //计算项目监理费应付金额(监理费*监理费合同折扣/监理含税税率)两位小数
+        BigDecimal fourResult = supervisorCostDecimal.multiply(supervisorDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
+        BigDecimal fivResult = fourResult.divide(supTaxRateDecimal,4,BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
+        projectBudget.setSupervisionFeePayable(fivResult.toString());
         //新增或编辑表单保存
+        projectBudget.preUpdate();
         projectBudgetService.update(projectBudget);
         costCheckService.updateDesignSup(projectBudget);
         j.setSuccess(true);
@@ -388,48 +403,52 @@ public class ProjectBudgetController extends BaseController {
     private List<ProjectBudget> getData(ImportExcel importExcel) throws ParseException {
         int lastRow = importExcel.getLastDataRowNum();
         List<ProjectBudget> list = new ArrayList<>();
-        ProjectBudget ProjectBudget;
+        ProjectBudget projectBudget;
         String projectType;
         for (int i = 3; i < lastRow; i++) {
-            ProjectBudget = new ProjectBudget();
+            projectBudget = new ProjectBudget();
             Row row = importExcel.getRow(i);
             String projectName = (String) importExcel.getCellValue(row, 0);
             String projectId = (String) importExcel.getCellValue(row, 1);
             if (StringUtils.isNotBlank(projectName) && StringUtils.isNotBlank(projectId)) {
-                ProjectBudget.setProjectName(projectName);
-                ProjectBudget.setProjectId(projectId);
-                ProjectBudget.setDesignUnit(getString(importExcel, row, 2));
-                ProjectBudget.setConstructionUnit(getString(importExcel, row, 3));
-                ProjectBudget.setBuildingAddress(getString(importExcel, row, 4));
-                ProjectBudget.setBuildingProperty(getString(importExcel, row, 5));
-                ProjectBudget.setTotalInvestment(getString(importExcel, row, 6));
-                ProjectBudget.setStartTime(getDate(importExcel, row, 7));
-                ProjectBudget.setStopTime(getDate(importExcel, row, 8));
-                ProjectBudget.setApprovalNumber(getString(importExcel, row, 9));
-                ProjectBudget.setConstructionCost(getDouble(importExcel, row, 10));
-                ProjectBudget.setInstallationCost(getDouble(importExcel, row, 11));
-                ProjectBudget.setEquipmentCost(getDouble(importExcel, row, 12));
-                ProjectBudget.setMaterialCost(getDouble(importExcel, row, 13));
+                projectBudget.setProjectName(projectName);
+                projectBudget.setProjectId(projectId);
+                projectBudget.setDesignUnit(getString(importExcel, row, 2));
+                projectBudget.setConstructionUnit(getString(importExcel, row, 3));
+                projectBudget.setBuildingAddress(getString(importExcel, row, 4));
+                projectBudget.setBuildingProperty(getString(importExcel, row, 5));
+                projectBudget.setTotalInvestment(getString(importExcel, row, 6));
+                projectBudget.setStartTime(getDate(importExcel, row, 7));
+                projectBudget.setStopTime(getDate(importExcel, row, 8));
+                projectBudget.setApprovalNumber(getString(importExcel, row, 9));
+                projectBudget.setConstructionCost(getDouble(importExcel, row, 10));
+                projectBudget.setInstallationCost(getDouble(importExcel, row, 11));
+                projectBudget.setEquipmentCost(getDouble(importExcel, row, 12));
+                projectBudget.setMaterialCost(getDouble(importExcel, row, 13));
                 double designCost = getDouble(importExcel, row, 14);
-                ProjectBudget.setDesignCost(designCost);
+                projectBudget.setDesignCost(designCost);
                 double supervisorCost = getDouble(importExcel, row, 15);
-                ProjectBudget.setSupervisorCost(supervisorCost);
-                ProjectBudget.setPreliminaryWorkCost(getDouble(importExcel, row, 16));
-                ProjectBudget.setCompensationCost(getDouble(importExcel, row, 17));
-                ProjectBudget.setAdministrationCost(getDouble(importExcel, row, 18));
+                projectBudget.setSupervisorCost(supervisorCost);
+                projectBudget.setPreliminaryWorkCost(getDouble(importExcel, row, 16));
+                projectBudget.setCompensationCost(getDouble(importExcel, row, 17));
+                projectBudget.setAdministrationCost(getDouble(importExcel, row, 18));
                 double designContractDiscount = getDisCount(importExcel, row, 19);
                 double designTypicalDiscount = getDisCount(importExcel, row, 20);
-                double supervisorContractDiscount = getDisCount(importExcel, row, 21);
-                ProjectBudget.setDesignContractDiscount(designContractDiscount);
-                ProjectBudget.setDesignTypicalDiscount(designTypicalDiscount);
-                ProjectBudget.setSupervisorContractDiscount(supervisorContractDiscount);
+                double designTaxRate = getDisCount(importExcel, row, 21);
+                double supervisorContractDiscount = getDisCount(importExcel, row, 22);
+                double supervisorTaxRate = getDisCount(importExcel, row, 23);
+                projectBudget.setDesignContractDiscount(designContractDiscount);
+                projectBudget.setDesignTaxRate(designTaxRate);
+                projectBudget.setDesignTypicalDiscount(designTypicalDiscount);
+                projectBudget.setSupervisorContractDiscount(supervisorContractDiscount);
+                projectBudget.setSupervisorTaxRate(supervisorTaxRate);
                 //判断项目是否以b开头,以字母“B”开头,则该项目为成本项目,project_type为0;否则为资本项目,project_type为1
                 if (projectId.startsWith("B")) {
                     projectType = "0";
                 } else {
                     projectType = "1";
                 }
-                ProjectBudget.setProjectType(projectType);
+                projectBudget.setProjectType(projectType);
                 //使用bigDecimal初始化数值,计算防止精度丢失问题
                 //设计费
                 BigDecimal bigDecimal = new BigDecimal(designCost);
@@ -443,18 +462,29 @@ public class ProjectBudgetController extends BaseController {
                 //设计典设折扣
                 BigDecimal bigDecimal3 = new BigDecimal(designTypicalDiscount);
                 BigDecimal desTypeDecimal = bigDecimal3.setScale(4, BigDecimal.ROUND_HALF_UP);
+                //设计含税税率
+                BigDecimal bigDecimal5 = new BigDecimal(designTaxRate);
+                BigDecimal desTaxRateDecimal = bigDecimal5.setScale(4, BigDecimal.ROUND_HALF_UP);
+
                 //监理费合同折扣
                 BigDecimal bigDecimal4 = new BigDecimal(supervisorContractDiscount);
                 BigDecimal supervisorDecimal = bigDecimal4.setScale(4, BigDecimal.ROUND_HALF_UP);
-                //计算项目设计费应付金额(设计费*设计合同折扣*设计典设折扣*1.06)两位小数
+                //监理含税税率
+                BigDecimal bigDecimal6 = new BigDecimal(supervisorTaxRate);
+                BigDecimal supTaxRateDecimal = bigDecimal6.setScale(4, BigDecimal.ROUND_HALF_UP);
+
+
+                //计算项目设计费应付金额(设计费*设计合同折扣*设计典设折扣/设计含税税率)两位小数
                 BigDecimal firResult = designCostDecimal.multiply(desConDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
                 BigDecimal secResult = firResult.multiply(desTypeDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
-                ProjectBudget.setDesignFeePayable(secResult.toString());
-                //计算项目监理费应付金额(监理费*监理费合同折扣*1.06)两位小数
-                BigDecimal thirdResult = supervisorCostDecimal.multiply(supervisorDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
-                ProjectBudget.setSupervisionFeePayable(thirdResult.toString());
-
-                list.add(ProjectBudget);
+                BigDecimal thirdResult = secResult.divide(desTaxRateDecimal,4,BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
+                projectBudget.setDesignFeePayable(thirdResult.toString());
+                //计算项目监理费应付金额(监理费*监理费合同折扣/监理含税税率)两位小数
+                BigDecimal fourResult = supervisorCostDecimal.multiply(supervisorDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
+                BigDecimal fivResult = fourResult.divide(supTaxRateDecimal,4,BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
+                projectBudget.setSupervisionFeePayable(fivResult.toString());
+
+                list.add(projectBudget);
             }
         }
         return list;
@@ -558,6 +588,7 @@ public class ProjectBudgetController extends BaseController {
                 j.setMsg("导入失败!失败信息:" + "表不符合规范");
                 return j;
             }
+
             //获取明细账数据 一个ErpAccount对象表示一行有效数据
             List<ErpAccount> erpAccounts = ErpInfo.getErpAccount(importUtil);
             //获取资本项目list循环
@@ -746,6 +777,7 @@ public class ProjectBudgetController extends BaseController {
                 }
                 j.setMsg(returnMsg.toString());
             }
+
             j.setSuccess(true);
             return j;
         } catch (Exception e) {

+ 139 - 0
src/main/webapp/webpage/modules/sg/financial/settlement/correspondingForm.jsp

@@ -0,0 +1,139 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<html>
+<head>
+	<title>财务项目概预算信息详细页面</title>
+	<meta name="decorator" content="ani"/>
+	<script type="text/javascript">
+		$(document).ready(function() {
+			$('#startDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+			$('#endDate').datetimepicker({
+				format: "YYYY-MM-DD"
+			});
+		});
+		function save() {
+            let isValidate = jp.validateForm('#inputForm');//校验表单
+            if(!isValidate){
+                return false;
+			}else{
+                jp.loading();
+				jp.post("${ctx}/finance/corresponding/save",$('#inputForm').serialize(), function (data) {
+					if (data.success) {
+						jp.getParent().refresh();
+						let dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+						parent.layer.close(dialogIndex);
+						jp.success(data.msg)
+					} else {
+						jp.error(data.msg);
+					}
+				});
+            }
+        }
+		function addRow(list, idx, tpl, row){
+			$(list).append(Mustache.render(tpl, {
+				idx: idx, delBtn: true, row: row
+			}));
+			$(list+idx).find("select").each(function(){
+				$(this).val($(this).attr("data-value"));
+			});
+			$(list+idx).find("input[type='checkbox'], input[type='radio']").each(function(){
+				var ss = $(this).attr("data-value").split(',');
+				for (var i=0; i<ss.length; i++){
+					if($(this).val() == ss[i]){
+						$(this).attr("checked","checked");
+					}
+				}
+			});
+			$(list+idx).find(".form_datetime").each(function(){
+				$(this).datetimepicker({
+					format: "YYYY-MM-DD HH:mm:ss"
+				});
+			});
+		}
+		function delRow(obj, prefix){
+			var id = $(prefix+"_id");
+			var delFlag = $(prefix+"_delFlag");
+			if (id.val() == ""){
+				$(obj).parent().parent().remove();
+			}else if(delFlag.val() == "0"){
+				delFlag.val("1");
+				$(obj).html("&divide;").attr("title", "撤销删除");
+				$(obj).parent().parent().addClass("error");
+			}else if(delFlag.val() == "1"){
+				delFlag.val("0");
+				$(obj).html("&times;").attr("title", "删除");
+				$(obj).parent().parent().removeClass("error");
+			}
+		}
+	</script>
+</head>
+<body class="bg-white">
+		<form:form id="inputForm" modelAttribute="corresponding" class="form-horizontal">
+		<form:hidden path="id"/>	
+		<table class="table table-bordered">
+		   <tbody>
+				<tr>
+					<td class="width-15 active"><label class="pull-right"><font color="red">*</font>序号:</label></td>
+					<td class="width-35">
+						<form:input path="serialNumber" htmlEscape="false"    class="form-control required"/>
+					</td>
+				</tr>
+		 	</tbody>
+		</table>
+			<div class="tabs-container">
+				<div class="tab-content">
+					<div id="tab-1" class="tab-pane fade in  active">
+						<a class="btn btn-white btn-sm" onclick="addRow('#childList', basicInformationRowIdx, basicInformationTpl);basicInformationRowIdx = basicInformationRowIdx + 1;" title="新增">	<i class="glyphicon glyphicon-plus"></i> 新建</a>
+						<table class="table table-striped table-bordered table-condensed">
+							<thead>
+							<tr>
+								<th class="hide"></th>
+								<th>物料编码<a style="color: red">*</a></th>
+								<th>物料类型<a style="color: red">*</a></th>
+								<th>物料描述<a style="color: red">*</a></th>
+								<th width="40">操作</th>
+							</tr>
+							</thead>
+							<tbody id="childList">
+							</tbody>
+						</table>
+						<script type="text/template" id="basicInformationTpl">//<!--
+				<tr id="childList{{idx}}">
+					<td class="hide">
+						<input id="childList{{idx}}_id" name="childList[{{idx}}].id" type="hidden" value="{{row.id}}"/>
+						<input id="childList{{idx}}_delFlag" name="childList[{{idx}}].delFlag" type="hidden" value="0"/>
+					</td>
+
+					<td  class="max-width-250">
+						<input type='text'  name="childList[{{idx}}].materialCode" class="form-control"  value="{{row.materialCode}}"/>
+					</td>
+
+					<td  class="max-width-250">
+						<input type='text'  name="childList[{{idx}}].materialType" class="form-control"  value="{{row.materialType}}"/>
+					</td>
+					<td>
+						<input type='text'  name="childList[{{idx}}].materialDescription" class="form-control"  value="{{row.materialDescription}}"/>
+					</td>
+					<td class="text-center" width="10">
+						{{#delBtn}}<span class="close" onclick="delRow(this, '#childList{{idx}}')" title="删除">&times;</span>{{/delBtn}}
+					</td>
+				</tr>//-->
+						</script>
+						<script type="text/javascript">
+							var basicInformationRowIdx = 0, basicInformationTpl = $("#basicInformationTpl").html().replace(/(\/\/\<!\-\-)|(\/\/\-\->)/g,"");
+							$(document).ready(function() {
+								var data = ${fns:toJson(corresponding.childList)};
+								for (var i=0; i<data.length; i++){
+									addRow('#childList', basicInformationRowIdx, basicInformationTpl, data[i]);
+									basicInformationRowIdx = basicInformationRowIdx + 1;
+								}
+							});
+						</script>
+					</div>
+				</div>
+			</div>
+	</form:form>
+</body>
+</html>

+ 255 - 0
src/main/webapp/webpage/modules/sg/financial/settlement/correspondingList.js

@@ -0,0 +1,255 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<script>
+    $(document).ready(function () {
+        $('#dataTable').bootstrapTable({
+            //请求方法
+            method: 'post',
+            //类型json
+            dataType: "json",
+            contentType: "application/x-www-form-urlencoded",
+            //显示检索按钮
+            showSearch: true,
+            //显示刷新按钮
+            showRefresh: true,
+            //显示切换手机试图按钮
+            showToggle: true,
+            //显示 内容列下拉框
+            showColumns: true,
+            //显示到处按钮
+            showExport: true,
+            //显示切换分页按钮
+            showPaginationSwitch: true,
+            //最低显示2行
+            minimumCountColumns: 2,
+            detailView: true,
+            //是否显示行间隔色
+            striped: true,
+            //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
+            cache: false,
+            //是否显示分页(*)
+            pagination: true,
+            //排序方式
+            sortOrder: "asc",
+            //初始化加载第一页,默认第一页
+            pageNumber: 1,
+            //每页的记录行数(*)
+            pageSize: 10,
+            //可供选择的每页的行数(*)
+            pageList: [10, 25, 50, 100],
+            //这个接口需要处理bootstrap table传递的固定参数,并返回特定格式的json数据
+            url: "${ctx}/finance/corresponding/data",
+            //默认值为 'limit',传给服务端的参数为:limit, offset, search, sort, order Else
+            //queryParamsType:'',
+            ////查询参数,每次调用是会带上这个参数,可自定义
+            queryParams: function (params) {
+                var searchParam = $("#searchForm").serializeJSON();
+                searchParam.pageNo = params.limit === undefined ? "1" : params.offset / params.limit + 1;
+                searchParam.pageSize = params.limit === undefined ? -1 : params.limit;
+                searchParam.orderBy = params.sort === undefined ? "" : params.sort + " " + params.order;
+                return searchParam;
+            },
+            //分页方式:client客户端分页,server服务端分页(*)
+            sidePagination: "server",
+            contextMenuTrigger: "right",//pc端 按右键弹出菜单
+            contextMenuTriggerMobile: "press",//手机端 弹出菜单,click:单击, press:长按。
+            contextMenu: '#context-menu',
+            onContextMenuItem: function (row, $el) {
+                if ($el.data("item") == "edit") {
+                    edit(row.id);
+                } else if ($el.data("item") == "view") {
+                    view(row.id);
+                } else if ($el.data("item") == "delete") {
+                    jp.confirm('确认要删除该数据记录吗?', function () {
+                        jp.loading();
+                        jp.get("${ctx}/sg/settlement/delete?id=" + row.id, function (data) {
+                            if (data.success) {
+                                $('#dataTable').bootstrapTable('refresh');
+                                jp.success(data.msg);
+                            } else {
+                                jp.error(data.msg);
+                            }
+                        })
+
+                    });
+
+                }
+            },
+            onClickRow: function (row, $el) {
+            },
+            onShowSearch: function () {
+                $("#search-collapse").slideToggle();
+            },
+            columns: [
+                {
+                checkbox: true
+                },{
+                    field: 'serialNumber',
+                    title: '序号',
+                    formatter: function (value, row, index) {
+                        value = jp.unescapeHTML(value);
+                        return "<a href='javascript:edit(\"" + row.id + "\")'>" + value + "</a>";
+                    }
+                }
+                ,{
+                    field: 'updateDate',
+                    title: '更新时间',
+                    formatter:function (value, row, index) {
+                        return jp.dateFormat(value,"yyyy-MM-dd");
+                    }
+                }
+            ],
+            onExpandRow: function (index, row, $detail) {
+                initSubTable(index, row, $detail);
+            }
+    });
+
+        //初始化子表格(无线循环)
+        initSubTable = function (index, row, $detail) {
+            var serialNumber = row.serialNumber;
+            var cur_table = $detail.html('<table></table>').find('table');
+            $(cur_table).bootstrapTable({
+                url: '${ctx}/finance/corresponding/detail',
+                method: 'post',
+                //类型json
+                dataType: "json",
+                contentType: "application/x-www-form-urlencoded",
+                queryParams : function(params) {
+                    var searchParam = $("#searchForm").serializeJSON();
+                    searchParam.pageNo = params.limit === undefined? "1" :params.offset/params.limit+1;
+                    searchParam.pageSize = params.limit === undefined? -1 : params.limit;
+                    searchParam.orderBy = params.sort === undefined? "" : params.sort+ " "+  params.order;
+                    searchParam.serialNumber = serialNumber;
+                    return searchParam;
+                },
+                striped: true, //是否显示行间隔色
+                pagination: false,//显示分页
+                sidePagination: "server",
+                pageNumber:1,
+                pageSize: 10,
+                pageList: [10, 25],
+                columns: [{
+                    field: 'materialCode',
+                    title: '物料编码',
+                    width: 390
+                }, {
+                    field: 'materialType',
+                    title: '物料类型',
+                    width: 390,
+                }, {
+                    field: 'materialDescription',
+                    title: '物料描述',
+                    width: 390,
+                }]
+            });
+        };
+
+        if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {//如果是移动端
+            $('#dataTable').bootstrapTable("toggleView");
+        }
+
+        $('#dataTable').on('check.bs.table uncheck.bs.table load-success.bs.table ' +
+            'check-all.bs.table uncheck-all.bs.table', function () {
+            $('#remove').prop('disabled', !$('#dataTable').bootstrapTable('getSelections').length);
+            $('#view,#edit').prop('disabled', $('#dataTable').bootstrapTable('getSelections').length != 1);
+        });
+
+        $("#btnImport").click(function () {
+            jp.open({
+                type: 2,
+                area: [500, 200],
+                auto: true,
+                title: "导入数据",
+                content: "${ctx}/tag/importExcel",
+                btn: ['下载模板','确定', '关闭'],
+                btn1: function(index, layero){
+                    jp.downloadFile('${ctx}/finance/corresponding/import/template');
+                },
+                btn2: function (index, layero) {
+                    var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                    iframeWin.contentWindow.importExcel('${ctx}/finance/corresponding/import', function (data) {
+                        if (data.success) {
+                            jp.success(data.msg);
+                            refresh();
+                        } else {
+                            jp.error(data.msg);
+                        }
+                        jp.close(index);
+                    });//调用保存事件
+                    return false;
+                },
+                btn3: function (index) {
+                    jp.close(index);
+                }
+            });
+        });
+
+
+        $("#export").click(function () {//导出Excel文件
+            jp.downloadFile('${ctx}/finance/corresponding/export');
+        });
+
+        $("#search").click("click", function () {// 绑定查询按扭
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        $("#reset").click("click", function () {// 绑定查询按扭
+            $("#searchForm  input").val("");
+            $("#searchForm  select").val("");
+            $("#searchForm  .select-item").html("");
+            $('#dataTable').bootstrapTable('refresh');
+        });
+
+        $("#open").click(function () {
+            $("#dataTable").bootstrapTable('expandAllRows');
+        })
+
+        $("#close").click(function (row) {
+            $('#dataTable').bootstrapTable('refresh');
+        })
+
+    });
+
+function getIdSelections() {
+    return $.map($("#dataTable").bootstrapTable('getSelections'), function (row) {
+        return row.id
+    });
+}
+
+function deleteAll() {
+    jp.confirm('确认要删除该数据记录吗?', function () {
+        jp.loading();
+        jp.get("${ctx}/finance/corresponding/deleteAll?ids=" + getIdSelections(), function (data) {
+            if (data.success) {
+                $('#dataTable').bootstrapTable('refresh');
+                jp.success(data.msg);
+            } else {
+                jp.error(data.msg);
+            }
+        })
+
+    })
+}
+
+//刷新列表
+function refresh() {
+    $('#dataTable').bootstrapTable('refresh');
+}
+
+function add(){
+    jp.openSaveDialog('新增', "${ctx}/finance/corresponding/form",'800px', '500px');
+}
+
+function edit(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openSaveDialog('编辑', "${ctx}/finance/corresponding/form?id=" + id, '800px', '500px');
+}
+
+function view(id) {//没有权限时,不显示确定按钮
+    if (id == undefined) {
+        id = getIdSelections();
+    }
+    jp.openViewDialog('查看', "${ctx}/finance/corresponding/form?id=" + id, '800px', '500px');
+}
+</script>

+ 97 - 0
src/main/webapp/webpage/modules/sg/financial/settlement/correspondingList.jsp

@@ -0,0 +1,97 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/webpage/include/taglib.jsp" %>
+<html>
+<head>
+    <title>财务项目概预算信息</title>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+    <meta name="decorator" content="ani"/>
+    <%@ include file="/webpage/include/bootstraptable.jsp" %>
+    <%@include file="/webpage/include/treeview.jsp" %>
+    <%@include file="correspondingList.js" %>
+    <script src="${ctxStatic}/plugin/bootstrapTable/bootstrap-table-resizable.js"></script>
+    <script src="${ctxStatic}/plugin/bootstrapTable/colResizable-1.6.js"></script>
+</head>
+<style>
+    .table {
+        table-layout: fixed;
+        word-break: break-all;
+        word-wrap: break-word;
+        text-align: center;
+    }
+
+    .table th, .table td {
+        text-align: center;
+        vertical-align: middle !important;
+    }
+</style>
+<body>
+<div class="wrapper wrapper-content">
+    <div class="panel panel-primary">
+        <div class="panel-heading">
+            <h3 class="panel-title">财务项目概预算信息管理</h3>
+        </div>
+        <div class="panel-body">
+
+            <!-- 搜索 -->
+            <div id="search-collapse" class="collapse">
+                <div class="accordion-inner">
+                    <form:form id="searchForm" modelAttribute="corresponding"
+                               class="form form-horizontal well clearfix">
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <label class="label-item single-overflow pull-left" title="序号:">序号:</label>
+                            <form:input path="serialNumber" htmlEscape="false" maxlength="64" class=" form-control"/>
+                        </div>
+                        <div class="col-xs-12 col-sm-6 col-md-4">
+                            <div style="margin-top:26px">
+                                <a id="search" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-search"></i> 查询</a>
+                                <a id="reset" class="btn btn-primary btn-rounded  btn-bordered btn-sm"><i
+                                        class="fa fa-refresh"></i> 重置</a>
+                            </div>
+                        </div>
+                    </form:form>
+                </div>
+            </div>
+
+            <!-- 工具栏 -->
+            <div id="toolbar">
+                <button id="open" class="btn btn-primary" >
+                    <i class="glyphicon glyphicon-list"></i> 全部展开
+                </button>
+                <button id="close" class="btn btn-primary">
+                    <i class="glyphicon glyphicon-minus"></i> 全部折叠
+                </button>
+                <shiro:hasPermission name="test:one:dialog:leave1:add">
+                    <button id="add" class="btn btn-primary" onclick="add()">
+                        <i class="glyphicon glyphicon-plus"></i> 新建
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:settlement:corresponding:del">
+                    <button id="remove" class="btn btn-danger" disabled onclick="deleteAll()">
+                        <i class="glyphicon glyphicon-remove"></i> 删除
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:settlement:corresponding:edit">
+                    <button id="edit" class="btn btn-success" disabled onclick="edit()">
+                        <i class="glyphicon glyphicon-edit"></i> 修改
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:settlement:corresponding:import">
+                    <button id="btnImport" class="btn btn-info">
+                        <i class="fa fa-folder-open-o"></i> 导入
+                    </button>
+                </shiro:hasPermission>
+                <shiro:hasPermission name="test:settlement:corresponding:export">
+                    <button id="export" class="btn btn-warning">
+                        <i class="fa fa-file-excel-o"></i> 导出
+                    </button>
+                </shiro:hasPermission>
+            </div>
+
+            <!-- 表格 -->
+            <table id="dataTable" style="table-layout:fixed" data-toolbar="#toolbar"></table>
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 8 - 8
src/main/webapp/webpage/modules/sg/financial/settlement/financeBudgetForm.jsp

@@ -153,24 +153,24 @@
 					</td>
 				</tr>
 				<tr>
-					<td class="width-15 active"><label class="pull-right"></label></td>
+					<td class="width-15 active"><label class="pull-right">设计典设折扣:</label></td>
 					<td class="width-35">
-
+						<form:input path="designTypicalDiscount" htmlEscape="false"    class="form-control number"/>
 					</td>
-					<td class="width-15 active"><label class="pull-right"></label></td>
+					<td class="width-15 active"><label class="pull-right">设计含税税率</label></td>
 					<td class="width-35">
-
+						<form:input path="designTaxRate" htmlEscape="false"    class="form-control number"/>
 					</td>
 				</tr>
 				<tr>
-					<td class="width-15 active"><label class="pull-right">设计典设折扣:</label></td>
-					<td class="width-35">
-						<form:input path="designTypicalDiscount" htmlEscape="false"    class="form-control number"/>
-					</td>
 					<td class="width-15 active"><label class="pull-right">监理合同折扣:</label></td>
 					<td class="width-35">
 						<form:input path="supervisorContractDiscount" htmlEscape="false"    class="form-control number"/>
 					</td>
+					<td class="width-15 active"><label class="pull-right">监理含税税率</label></td>
+					<td class="width-35">
+						<form:input path="supervisorTaxRate" htmlEscape="false"    class="form-control number"/>
+					</td>
 				</tr>
 		 	</tbody>
 		</table>