소스 검색

1.下月新增投保修改。

tomatozq 5 년 전
부모
커밋
1619eb2841
20개의 변경된 파일359개의 추가작업 그리고 167개의 파일을 삭제
  1. 9 93
      picc-admin-server/src/main/java/com/jpsoft/picc/modules/business/controller/InsurancePolicyController.java
  2. 1 1
      picc-admin-server/src/test/java/com/jpsoft/picc/test/PolicyTest.java
  3. 1 2
      picc-common/src/main/java/com/jpsoft/picc/modules/base/dao/CompanyMemberDAO.java
  4. 1 1
      picc-common/src/main/java/com/jpsoft/picc/modules/base/service/CompanyMemberService.java
  5. 2 2
      picc-common/src/main/java/com/jpsoft/picc/modules/base/service/impl/CompanyMemberServiceImpl.java
  6. 5 0
      picc-common/src/main/java/com/jpsoft/picc/modules/business/dao/InsuranceApplicationDAO.java
  7. 1 2
      picc-common/src/main/java/com/jpsoft/picc/modules/business/dao/InsurancePolicyDAO.java
  8. 10 0
      picc-common/src/main/java/com/jpsoft/picc/modules/business/entity/InsuranceApplication.java
  9. 5 0
      picc-common/src/main/java/com/jpsoft/picc/modules/business/service/InsuranceApplicationService.java
  10. 3 1
      picc-common/src/main/java/com/jpsoft/picc/modules/business/service/InsurancePolicyService.java
  11. 11 0
      picc-common/src/main/java/com/jpsoft/picc/modules/business/service/impl/InsuranceApplicationServiceImpl.java
  12. 45 2
      picc-common/src/main/java/com/jpsoft/picc/modules/business/service/impl/InsurancePolicyServiceImpl.java
  13. 2 2
      picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/SignUtil.java
  14. 5 1
      picc-common/src/main/resources/mapper/base/CompanyMember.xml
  15. 30 1
      picc-common/src/main/resources/mapper/business/InsuranceApplication.xml
  16. 4 3
      picc-common/src/main/resources/mapper/business/InsurancePolicy.xml
  17. 63 0
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyController.java
  18. 33 1
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyUserController.java
  19. 2 0
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/dto/InsuranceApplicationDTO.java
  20. 126 55
      picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/PayController.java

+ 9 - 93
picc-admin-server/src/main/java/com/jpsoft/picc/modules/business/controller/InsurancePolicyController.java

@@ -710,30 +710,16 @@ public class InsurancePolicyController {
         destPolicy.setEndTime(startTime.plusMonths(1).toDate());
         destPolicy.setEffectiveDate(startTime.toString("yyyyMM"));
 
-        //todo 相同企业、相同险种、截止时间相同 是否已经有下月参保记录(状态为草稿)
-        InsurancePolicy nextMonthPolicy = insurancePolicyService.findNextMonthPolicy(
-                insuranceApplication.getCompanyId(),
-                destPolicy.getDefinitionId(),
-                insuranceApplication.getEndTime(),
-                destPolicy.getEffectiveDate(),
-                PolicyStatus.Draft.getValue() + "");
-
-        if(nextMonthPolicy==null) {
-            //todo 如果没有则新建一条下月投保记录
-            destPolicy.setNo(srcPolicy.getNo() + 1);
-            destPolicy.setId(UUID.randomUUID().toString());
-            destPolicy.setStatus(PolicyStatus.Draft.getValue() + "");
-            destPolicy.setLatestApplicationId(applicationId);
-            destPolicy.setCompanyId(insuranceApplication.getCompanyId());
-            destPolicy.setCreateBy(subject);
-            destPolicy.setCreateTime(new Date());
-
-            insurancePolicyService.insert(destPolicy);
-
-            //关联投保单及每月投保单
+        //todo 如果有则判断关联当前投保单的下月投保记录是否存在
+        boolean exist = insurancePolicyService.existByApplicationIdAndEffectiveDate(applicationId, destPolicy.getEffectiveDate());
+
+        if (!exist) {
+            //todo 关联投保单及下月投保单
             ApplicationPolicy applicationPolicy = new ApplicationPolicy();
             applicationPolicy.setId(UUID.randomUUID().toString());
             applicationPolicy.setApplicationId(applicationId);
+
+            //下月投保单已存在(创建时间)<当前投保单创建时间,所以排序要按照start_time
             applicationPolicy.setPolicyId(destPolicy.getId());
 
             applicationPolicyService.insert(applicationPolicy);
@@ -755,83 +741,13 @@ public class InsurancePolicyController {
                 insurancePolicyMemberService.insert(destMember);
             }
 
-            updatePolicyNumAndAmount(destPolicy,subject);
+            insurancePolicyService.updatePolicyNumAndAmount(destPolicy,subject);
         }
         else{
-            //todo 如果有则判断关联当前投保单的下月投保记录是否存在
-            boolean exist = insurancePolicyService.existByApplicationIdAndEffectiveDate(applicationId, destPolicy.getEffectiveDate());
-
-            if (!exist) {
-                //todo 如果关联当前投保单的下月投保单不存在,但关联当前企业、相同险种的投保单存在则合并
-
-                //关联投保单及下月投保单
-                ApplicationPolicy applicationPolicy = new ApplicationPolicy();
-                applicationPolicy.setId(UUID.randomUUID().toString());
-                applicationPolicy.setApplicationId(applicationId);
-
-                //下月投保单已存在(创建时间)<当前投保单创建时间,所以排序要按照start_time
-                applicationPolicy.setPolicyId(nextMonthPolicy.getId());
-
-                applicationPolicyService.insert(applicationPolicy);
-
-                //todo 关联参保人员
-                List<InsurancePolicyMember> memberList = insurancePolicyMemberService.findByPolicyId(policyId);
-
-                for (InsurancePolicyMember srcMember : memberList) {
-                    //人员不重复
-                    if (!insurancePolicyMemberService.exist(nextMonthPolicy.getId(),srcMember.getMemberId())) {
-                        InsurancePolicyMember destMember = new InsurancePolicyMember();
-
-                        destMember.setId(UUID.randomUUID().toString());
-                        destMember.setPolicyId(nextMonthPolicy.getId());
-                        destMember.setMemberId(srcMember.getMemberId());
-                        destMember.setDelFlag(false);
-                        destMember.setCreateBy(subject);
-                        destMember.setCreateTime(new Date());
-                        destMember.setStatus(srcMember.getStatus());
-
-                        insurancePolicyMemberService.insert(destMember);
-                    }
-                }
-
-                updatePolicyNumAndAmount(nextMonthPolicy,subject);
-            }
-            else{
-                throw new Exception(destPolicy.getEffectiveDate() + "投保单已存在!");
-            }
+            throw new Exception(destPolicy.getEffectiveDate() + "投保单已存在!");
         }
     }
 
-    /**
-     * 更新下月投保单的费用和人数
-     * @param insurancePolicy
-     * @param subject
-     */
-    private void updatePolicyNumAndAmount(InsurancePolicy insurancePolicy,String subject) {
-        List<InsuranceJobs> InsuranceJobsList = insuranceJobsService.findByDefinitionId(insurancePolicy.getDefinitionId());
-
-        int months = 1;
-
-        BigDecimal totalAmount = new BigDecimal(0);
-        long totalNumber = 0;
-
-        for (InsuranceJobs insuranceJobs:InsuranceJobsList) {
-            long count = insurancePolicyMemberService.countByPolicyIdAndJobsId(insurancePolicy.getId(),insuranceJobs.getJobsId());
-            BigDecimal money = insuranceJobs.getCharges().multiply(new BigDecimal(months)).multiply(new BigDecimal(count));
-            totalAmount = totalAmount.add(money);
-            totalNumber += count;
-        }
-
-        //更新下月投保单的参保人数和参保费用
-        insurancePolicy.setInsuranceFee(totalAmount);
-        insurancePolicy.setNumber((int)totalNumber);
-
-        insurancePolicy.setUpdateTime(new Date());
-        insurancePolicy.setUpdateBy(subject);
-
-        insurancePolicyService.update(insurancePolicy);
-    }
-
     private void check(String policyId,String status,String subject){
         List<InsurancePolicyMember> insurancePolicyMemberList = insurancePolicyMemberService.findByPolicyId(policyId);
 

+ 1 - 1
picc-admin-server/src/test/java/com/jpsoft/picc/test/PolicyTest.java

@@ -31,7 +31,7 @@ public class PolicyTest {
         policy.setStatus("70");
         insurancePolicyService.update(policy);
 
-        insurancePolicyService.findNextMonthPolicy("1", "2", new Date(), "3", "4");
+        //insurancePolicyService.findNextMonthPolicy("1", "2", new Date(), "3", "4");
     }
 
     @Test

+ 1 - 2
picc-common/src/main/java/com/jpsoft/picc/modules/base/dao/CompanyMemberDAO.java

@@ -15,6 +15,5 @@ public interface CompanyMemberDAO {
 	int delete(String id);
 	List<CompanyMember> list();
 	List<CompanyMember> search(Map<String, Object> searchParams, List<Sort> sortList);
-
-    List<CompanyMember> findByNotInPolicyMember(String companyId, String policyId);
+    List<CompanyMember> findByNotInPolicyMember(String companyId, List<String> excludePolicyIds);
 }

+ 1 - 1
picc-common/src/main/java/com/jpsoft/picc/modules/base/service/CompanyMemberService.java

@@ -14,5 +14,5 @@ public interface CompanyMemberService {
 	int delete(String id);
 	List<CompanyMember> list();
 	Page<CompanyMember> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, List<Sort> sortList);
-    List<CompanyMember> findByNotInPolicyMember(String companyId, String policyId);
+    List<CompanyMember> findByNotInPolicyMember(String companyId, List<String> excludePolicyIds);
 }

+ 2 - 2
picc-common/src/main/java/com/jpsoft/picc/modules/base/service/impl/CompanyMemberServiceImpl.java

@@ -69,7 +69,7 @@ public class CompanyMemberServiceImpl implements CompanyMemberService {
 	}
 
 	@Override
-	public List<CompanyMember> findByNotInPolicyMember(String companyId, String policyId) {
-		return companyMemberDAO.findByNotInPolicyMember(companyId,policyId);
+	public List<CompanyMember> findByNotInPolicyMember(String companyId, List<String> excludePolicyIds) {
+		return companyMemberDAO.findByNotInPolicyMember(companyId,excludePolicyIds);
 	}
 }

+ 5 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/business/dao/InsuranceApplicationDAO.java

@@ -4,6 +4,7 @@ import com.jpsoft.picc.modules.business.entity.InsuranceApplication;
 import com.jpsoft.picc.modules.common.dto.Sort;
 import org.springframework.stereotype.Repository;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -26,4 +27,8 @@ public interface InsuranceApplicationDAO {
     List<InsuranceApplication> findByCompanyIdAndCreatTime(String companyId,String status,String startTime,String endTime);
 
     List<InsuranceApplication> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    List<InsuranceApplication> findByDuration(String companyId, String definitionId, Date startTime, Date endTime,String[] status);
+
+    List<InsuranceApplication> findByCombinePolicyId(String combinePolicyId);
 }

+ 1 - 2
picc-common/src/main/java/com/jpsoft/picc/modules/business/dao/InsurancePolicyDAO.java

@@ -29,8 +29,7 @@ public interface InsurancePolicyDAO {
 
     List<InsurancePolicy> nextMonthPageList(Map<String, Object> searchParams, List<Sort> sortList);
 
-    InsurancePolicy findNextMonthPolicy(String companyId, String definitionId, Date endTime, String effectiveDate, String status);
-
+    List<InsurancePolicy> findNextMonthPolicy(String companyId, String definitionId,Date startTime, Date endTime, String[] status);
 
     List<InsurancePolicy> toBeAdjustedPolicy(String effectiveDate,String status);
 }

+ 10 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/business/entity/InsuranceApplication.java

@@ -75,6 +75,8 @@ public class InsuranceApplication {
 	private Date updateTime;
     @ApiModelProperty(value = "是否删除")
 	private Boolean delFlag;
+	@ApiModelProperty(value = "待合并的每月投保单")
+	private String combinePolicyId;
 
 	@ApiModelProperty(value = "最新的每月投保单,不写入数据库,作查询使用")
 	private InsurancePolicy insurancePolicy;
@@ -475,4 +477,12 @@ public class InsuranceApplication {
 	public void setBusinessNatureN(String businessNatureN) {
 		this.businessNatureN = businessNatureN;
 	}
+
+	public String getCombinePolicyId() {
+		return combinePolicyId;
+	}
+
+	public void setCombinePolicyId(String combinePolicyId) {
+		this.combinePolicyId = combinePolicyId;
+	}
 }

+ 5 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/business/service/InsuranceApplicationService.java

@@ -4,6 +4,7 @@ import com.github.pagehelper.Page;
 import com.jpsoft.picc.modules.business.entity.InsuranceApplication;
 import com.jpsoft.picc.modules.common.dto.Sort;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -25,4 +26,8 @@ public interface InsuranceApplicationService {
     List<InsuranceApplication> findByCompanyId(String companyId,String status);
 
     List<InsuranceApplication> findByCompanyIdAndCreatTime(String companyId,String status,String startTime,String endTime);
+
+    List<InsuranceApplication> findByDuration(String companyId, String definitionId, Date startTime, Date endTime,String[] status);
+
+    List<InsuranceApplication> findByCombinePolicyId(String policyId);
 }

+ 3 - 1
picc-common/src/main/java/com/jpsoft/picc/modules/business/service/InsurancePolicyService.java

@@ -28,7 +28,9 @@ public interface InsurancePolicyService {
 
     Page<InsurancePolicy> nextMonthPageList(Map<String, Object> searchParams, int pageIndex, int pageSize, List<Sort> sortList);
 
-    InsurancePolicy findNextMonthPolicy(String companyId, String definitionId, Date endTime, String effectiveDate, String status);
+    List<InsurancePolicy> findNextMonthPolicy(String companyId, String definitionId,Date startTime, Date endTime,String[] status);
 
     List<InsurancePolicy> toBeAdjustedPolicy(String effectiveDate,String status);
+
+    void updatePolicyNumAndAmount(InsurancePolicy destPolicy, String subject);
 }

+ 11 - 0
picc-common/src/main/java/com/jpsoft/picc/modules/business/service/impl/InsuranceApplicationServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -77,4 +78,14 @@ public class InsuranceApplicationServiceImpl implements InsuranceApplicationServ
 
         return page;
     }
+
+    @Override
+    public List<InsuranceApplication> findByDuration(String companyId, String definitionId, Date startTime, Date endTime,String[] status) {
+        return insuranceApplicationDAO.findByDuration(companyId,definitionId,startTime,endTime,status);
+    }
+
+    @Override
+    public List<InsuranceApplication> findByCombinePolicyId(String combinePolicyId) {
+        return insuranceApplicationDAO.findByCombinePolicyId(combinePolicyId);
+    }
 }

+ 45 - 2
picc-common/src/main/java/com/jpsoft/picc/modules/business/service/impl/InsurancePolicyServiceImpl.java

@@ -3,14 +3,19 @@ package com.jpsoft.picc.modules.business.service.impl;
 import cn.hutool.core.date.DateTime;
 import com.github.pagehelper.Page;
 import com.github.pagehelper.PageHelper;
+import com.jpsoft.picc.modules.base.dao.InsuranceJobsDAO;
+import com.jpsoft.picc.modules.base.entity.InsuranceJobs;
 import com.jpsoft.picc.modules.business.dao.InsurancePolicyDAO;
+import com.jpsoft.picc.modules.business.dao.InsurancePolicyMemberDAO;
 import com.jpsoft.picc.modules.business.entity.InsurancePolicy;
 import com.jpsoft.picc.modules.business.service.InsurancePolicyService;
 import com.jpsoft.picc.modules.common.dto.Sort;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -21,6 +26,12 @@ public class InsurancePolicyServiceImpl implements InsurancePolicyService {
     @Resource(name = "insurancePolicyDAO")
     private InsurancePolicyDAO insurancePolicyDAO;
 
+    @Autowired
+    private InsuranceJobsDAO insuranceJobsDAO;
+
+    @Autowired
+    private InsurancePolicyMemberDAO insurancePolicyMemberDAO;
+
     @Override
     public InsurancePolicy get(String id) {
         // TODO Auto-generated method stub
@@ -92,7 +103,39 @@ public class InsurancePolicyServiceImpl implements InsurancePolicyService {
     }
 
     @Override
-    public InsurancePolicy findNextMonthPolicy(String companyId, String definitionId, Date endTime, String effectiveDate, String status) {
-        return insurancePolicyDAO.findNextMonthPolicy(companyId,definitionId,endTime, effectiveDate,status);
+    public List<InsurancePolicy> findNextMonthPolicy(String companyId, String definitionId,
+                                                     Date startTime,Date endTime, String[] status) {
+        return insurancePolicyDAO.findNextMonthPolicy(companyId,definitionId,startTime,endTime,status);
+    }
+
+
+    /**
+     * 更新下月投保单的费用和人数
+     * @param insurancePolicy
+     * @param subject
+     */
+    public void updatePolicyNumAndAmount(InsurancePolicy insurancePolicy,String subject) {
+        List<InsuranceJobs> InsuranceJobsList = insuranceJobsDAO.findByDefinitionId(insurancePolicy.getDefinitionId());
+
+        int months = 1;
+
+        BigDecimal totalAmount = new BigDecimal(0);
+        long totalNumber = 0;
+
+        for (InsuranceJobs insuranceJobs:InsuranceJobsList) {
+            long count = insurancePolicyMemberDAO.countByPolicyIdAndJobsId(insurancePolicy.getId(),insuranceJobs.getJobsId());
+            BigDecimal money = insuranceJobs.getCharges().multiply(new BigDecimal(months)).multiply(new BigDecimal(count));
+            totalAmount = totalAmount.add(money);
+            totalNumber += count;
+        }
+
+        //更新下月投保单的参保人数和参保费用
+        insurancePolicy.setInsuranceFee(totalAmount);
+        insurancePolicy.setNumber((int)totalNumber);
+
+        insurancePolicy.setUpdateTime(new Date());
+        insurancePolicy.setUpdateBy(subject);
+
+        update(insurancePolicy);
     }
 }

+ 2 - 2
picc-common/src/main/java/com/jpsoft/picc/modules/common/utils/SignUtil.java

@@ -88,10 +88,10 @@ public class SignUtil {
     public static void main(String[] args){
         HashMap<String,Object> signMap = new HashMap<String,Object>();
 
-        signMap.put("orderNo","20200305192042359");
+        signMap.put("orderNo","20200308141313953");
         signMap.put("payType","1");
         signMap.put("code","008");
-        signMap.put("payTime","1583407242");
+        signMap.put("payTime","1583647993");
         signMap.put("userMoney","1000");
 
         String md5_sign = "";

+ 5 - 1
picc-common/src/main/resources/mapper/base/CompanyMember.xml

@@ -159,7 +159,11 @@
 		select * from base_company_member t1
 		where t1.del_flag=0 and t1.company_id=#{companyId}
 		and t1.id_ not in(
-			select member_id from business_insurance_policy_member where policy_id=#{policyId} and del_flag=0
+			select member_id from business_insurance_policy_member
+			where del_flag=0
+			<foreach item="policyId" collection="excludePolicyIds" open=" and policy_id in(" separator="," close=")">
+				#{policyId}
+			</foreach>
 		)
 	</select>
 </mapper>

+ 30 - 1
picc-common/src/main/resources/mapper/business/InsuranceApplication.xml

@@ -31,6 +31,7 @@
         <result property="updateBy" column="update_by"/>
         <result property="updateTime" column="update_time"/>
         <result property="delFlag" column="del_flag"/>
+        <result property="combinePolicyId" column="combine_policy_id"/>
     </resultMap>
     <resultMap id="InsuranceApplicationMap2" extends="InsuranceApplicationMap" type="com.jpsoft.picc.modules.business.entity.InsuranceApplication">
         <association property="businessNatureN"
@@ -47,7 +48,9 @@
         <![CDATA[
 		insert into business_insurance_application
 	    (id_,company_id,definition_id,insured_name,insured_tel,company_name,uscc_code,
-	    business_scope,business_nature,industry_type,tel_,postal_,employees_number,insured_number,company_address,loss_in_recent_years,start_time,end_time,insurance_fee,status_,process_status,create_by,create_time,update_by,update_time,del_flag)
+	    business_scope,business_nature,industry_type,tel_,postal_,employees_number,insured_number,company_address,
+	    loss_in_recent_years,start_time,end_time,insurance_fee,status_,process_status,create_by,create_time,
+	    update_by,update_time,del_flag,combine_policy_id)
 		values
 		(
             #{id,jdbcType=VARCHAR}
@@ -76,6 +79,7 @@
             ,#{updateBy,jdbcType=VARCHAR}
             ,#{updateTime,jdbcType= TIMESTAMP }
             ,#{delFlag,jdbcType= NUMERIC }
+            ,#{combinePolicyId,jdbcType=VARCHAR}
 		)
 	]]>
     </insert>
@@ -160,6 +164,9 @@
             <if test="delFlag!=null">
                 del_flag=#{delFlag,jdbcType= NUMERIC },
             </if>
+            <if test="combinePolicyId!=null">
+                combine_policy_id=#{combinePolicyId,jdbcType=VARCHAR},
+            </if>
         </set>
         where id_=#{id}
     </update>
@@ -238,4 +245,26 @@
             ${sort.name} ${sort.order}
         </foreach>
     </select>
+    <select id="findByDuration" resultMap="InsuranceApplicationMap">
+        <![CDATA[
+            select * from business_insurance_application
+            where company_id=#{companyId}
+            and definition_id=#{definitionId}
+            and start_time =#{startTime}
+			and end_time = #{endTime}
+            and del_flag = 0
+        ]]>
+        <foreach item="item" collection="status" open=" and status_ in(" separator="," close=")">
+            ${item}
+        </foreach>
+        order by create_time asc
+    </select>
+    <select id="findByCombinePolicyId" resultMap="InsuranceApplicationMap">
+        <![CDATA[
+            select * from business_insurance_application
+            where combine_policy_id=#{combinePolicyId}
+            and del_flag = 0
+        ]]>
+        order by create_time asc
+    </select>
 </mapper>

+ 4 - 3
picc-common/src/main/resources/mapper/business/InsurancePolicy.xml

@@ -243,11 +243,12 @@
         inner join business_insurance_application d on c.application_id = d.id_
         where d.definition_id = #{definitionId}
         and d.company_id = #{companyId}
+        and a.start_time=#{startTime}
         and d.end_time = #{endTime}
-        and a.effective_date=#{effectiveDate}
-        and a.status_ = #{status}
+        <foreach item="item" collection="status" open=" and status_ in(" separator="," close=")">
+            ${item}
+        </foreach>
         order by a.create_time asc
-        limit 1
     </select>
     <select id="toBeAdjustedPolicy" resultMap="InsurancePolicyMap">
         select * from business_insurance_policy

+ 63 - 0
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyController.java

@@ -631,4 +631,67 @@ public class InsurancePolicyController {
 
         return msgResult;
     }
+
+    @PostMapping(value="addMemberOfNextMonthPolicy")
+    @ApiOperation(value = "下月投保单中新增人员")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "policyId",value = "下月投保单", required = true, paramType = "form")
+    })
+    public MessageResult<String> addMemberOfNextMonthPolicy(String policyId,HttpServletRequest request){
+        MessageResult<String> messageResult = new MessageResult<>();
+
+        try {
+            AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
+            CompanyUser companyUser = companyUserService.findByUserName(principal.getName());
+
+            //todo 新增一份投保单用于缴费,截止月份相同,起始月份为当前投保单月份,流程只需要经过初审、复审、缴费后就合并。
+            List<InsuranceApplication> applicationList = applicationPolicyService.findApplicationByPolicyId(policyId);
+            InsuranceApplication insuranceApplication = null;
+
+            InsurancePolicy insurancePolicy = insurancePolicyService.get(policyId);
+
+            if (applicationList.size()>0) {
+                insuranceApplication = applicationList.get(0);
+            }
+
+            //todo 判断当前相同企业、相同险种、生效期限相同的投保单是否存在
+//            List<InsuranceApplication> destList = insuranceApplicationService.findByDuration(insuranceApplication.getCompanyId(),
+//                                                        insuranceApplication.getDefinitionId(),
+//                                                        insurancePolicy.getStartTime(),
+//                                                        insuranceApplication.getEndTime(),
+//                                                        new String[]{PolicyStatus.Draft.getValue() + "",PolicyStatus.Back.getValue() + ""});
+            List<InsuranceApplication> destList = insuranceApplicationService.findByCombinePolicyId(policyId);
+
+            InsuranceApplication destApplication = null;
+
+            if(destList.size()>0) {
+                destApplication = destList.get(0);
+            }
+
+            if(destApplication==null) {
+                destApplication = insuranceApplication;
+                destApplication.setId(UUID.randomUUID().toString());
+                destApplication.setCreateTime(new Date());
+                destApplication.setCreateBy(principal.getName());
+                destApplication.setInsuranceFee(new BigDecimal(0));
+                destApplication.setInsuredNumber(0);
+                destApplication.setStartTime(insurancePolicy.getStartTime()); //月份改为当前月份
+                destApplication.setStatus(PolicyStatus.Draft.getValue() + "");
+                destApplication.setDelFlag(false); //如果缴费后,将这个状态设为true
+                destApplication.setCombinePolicyId(policyId); //设置要合并的每月投保单
+
+                insuranceApplicationService.insert(destApplication);
+                messageResult.setData(destApplication.getId());
+            }
+
+            messageResult.setResult(true);
+            messageResult.setData(destApplication.getId());
+        }
+        catch (Exception ex){
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
 }

+ 33 - 1
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/controller/InsurancePolicyUserController.java

@@ -14,6 +14,7 @@ import com.jpsoft.picc.modules.business.service.ApplicationPolicyService;
 import com.jpsoft.picc.modules.business.service.InsuranceApplicationService;
 import com.jpsoft.picc.modules.business.service.InsurancePolicyMemberService;
 import com.jpsoft.picc.modules.business.service.InsurancePolicyService;
+import com.jpsoft.picc.modules.common.constant.PolicyStatus;
 import com.jpsoft.picc.modules.common.dto.MessageResult;
 import com.jpsoft.picc.modules.common.dto.Sort;
 import com.jpsoft.picc.modules.common.utils.POIUtils;
@@ -24,6 +25,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.jasig.cas.client.authentication.AttributePrincipal;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -110,6 +112,7 @@ public class InsurancePolicyUserController {
         List<Sort> sortList = new ArrayList<>();
         sortList.add(new Sort("create_time","asc"));
         Map<String,Object> searchParams = new HashMap<>();
+
         searchParams.put("policyId",policyId);
 
         Page<InsurancePolicyMember> page = insurancePolicyMemberService.pageSearch(searchParams,pageIndex,pageSize,sortList);
@@ -132,7 +135,36 @@ public class InsurancePolicyUserController {
         Company company = companyService.findByCreateBy(principal.getName());
 
         try {
-            List<CompanyMember> memberList = companyMemberService.findByNotInPolicyMember(company.getId(),policyId);
+            InsurancePolicy insurancePolicy = insurancePolicyService.get(policyId);
+            String applicationId = insurancePolicy.getLatestApplicationId();
+
+            List<String> excludePolicyIds = new ArrayList<>();
+
+            if (StringUtils.isNotEmpty(applicationId)) {
+                InsuranceApplication insuranceApplication = insuranceApplicationService.get(applicationId);
+
+                excludePolicyIds.add(policyId);
+
+                if (StringUtils.isNotEmpty(insuranceApplication.getCombinePolicyId())){
+                    excludePolicyIds.add(insuranceApplication.getCombinePolicyId());
+                }
+//                DateTime startTime = new DateTime(insuranceApplication.getStartTime());
+
+                //todo 相同企业、相同险种、相同生效时间段 是否已经有每月投保单
+//                List<InsurancePolicy> policyList = insurancePolicyService.findNextMonthPolicy(
+//                        insuranceApplication.getCompanyId(),
+//                        insuranceApplication.getDefinitionId(),
+//                        startTime.toDate(),
+//                        startTime.plusMonths(1).toDate(),
+//                        new String[]{PolicyStatus.Draft.getValue() + "", PolicyStatus.Back.getText() + ""});
+
+//                for (InsurancePolicy policy : policyList) {
+                    //todo 排除现有投保单中的人员
+//                    excludePolicyIds.add(policy.getId());
+//                }
+            }
+
+            List<CompanyMember> memberList = companyMemberService.findByNotInPolicyMember(company.getId(),excludePolicyIds);
 
             msgResult.setData(memberList);
             msgResult.setResult(true);

+ 2 - 0
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/auth/dto/InsuranceApplicationDTO.java

@@ -60,4 +60,6 @@ public class InsuranceApplicationDTO {
     private String processStatus;
     @ApiModelProperty(value = "每月投保单编号")
     private String policyId;
+    @ApiModelProperty(value = "要合并的每月投保单编号")
+    private String combinePolicyId;
 }

+ 126 - 55
picc-enterprise-server/src/main/java/com/jpsoft/picc/modules/pub/controller/PayController.java

@@ -5,10 +5,13 @@ import com.jpsoft.picc.config.JpCloudConfig;
 import com.jpsoft.picc.modules.base.entity.TransactionRecord;
 import com.jpsoft.picc.modules.base.service.CompanyService;
 import com.jpsoft.picc.modules.base.service.TransactionRecordService;
+import com.jpsoft.picc.modules.business.entity.ApplicationPolicy;
 import com.jpsoft.picc.modules.business.entity.InsuranceApplication;
 import com.jpsoft.picc.modules.business.entity.InsurancePolicy;
+import com.jpsoft.picc.modules.business.entity.InsurancePolicyMember;
 import com.jpsoft.picc.modules.business.service.ApplicationPolicyService;
 import com.jpsoft.picc.modules.business.service.InsuranceApplicationService;
+import com.jpsoft.picc.modules.business.service.InsurancePolicyMemberService;
 import com.jpsoft.picc.modules.business.service.InsurancePolicyService;
 import com.jpsoft.picc.modules.common.constant.PolicyStatus;
 import com.jpsoft.picc.modules.common.dto.MessageResult;
@@ -22,12 +25,13 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author 墨鱼_mo
@@ -54,11 +58,15 @@ public class PayController {
     @Autowired
     private InsurancePolicyService insurancePolicyService;
 
+    @Autowired
+    private InsurancePolicyMemberService insurancePolicyMemberService;
+
     @Autowired
     private CompanyService companyService;
 
     @PostMapping(value = "/orderNotifyBack")
     @ResponseBody
+    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
     public Map orderNotifyBack(String orderNo,String payType,
                                String code,String payTime,
                                String sign,String userMoney) {
@@ -66,78 +74,141 @@ public class PayController {
 
         String status = "success";
         String message = "订单支付成功";
-        JSONObject body = new JSONObject();
+//        JSONObject body = new JSONObject();
         log.warn("payTime>>>" + payTime + "paymentType>>>" + payType + ">>>>orderNo>>" + orderNo + "sign>>>" + sign);
-        if(StringUtils.isNotBlank(payType) && StringUtils.isNotBlank(orderNo)){
 
-            HashMap<String,Object> signMap = new HashMap<String,Object>();
+        try {
+            if (StringUtils.isEmpty(orderNo)) {
+                throw new Exception("订单号不存在");
+            }
+
+            HashMap<String, Object> signMap = new HashMap<String, Object>();
 
-            signMap.put("orderNo",orderNo);
-            signMap.put("payType",payType);
-            signMap.put("code",code);
-            signMap.put("payTime",payTime);
-            signMap.put("userMoney",userMoney);
+            signMap.put("orderNo", orderNo);
+            signMap.put("payType", payType);
+            signMap.put("code", code);
+            signMap.put("payTime", payTime);
+            signMap.put("userMoney", userMoney);
 
-            boolean result = SignUtil.validateSign(signMap,"1234567890",sign);
+            boolean result = SignUtil.validateSign(signMap, "1234567890", sign);
 
-            if(result){
-                TransactionRecord transactionRecord = transactionRecordService.getByOrderNo(orderNo);
+            if (!result) {
+                throw new Exception("签名不正确");
+            }
+
+            TransactionRecord transactionRecord = transactionRecordService.getByOrderNo(orderNo);
 
+            if (transactionRecord == null) {
+                throw new Exception("订单不存在");
+            } else if ("20".equals(transactionRecord.getPaymentStatus())) {
+                message = "订单已支付";
+                status = "success";
+            } else {
                 InsuranceApplication insuranceApplication = insuranceApplicationService.get(transactionRecord.getApplicationId());
 
-                if(transactionRecord != null && !"20".equals(transactionRecord.getPaymentStatus())){
-                    transactionRecord.setPaymentStatus("20");
-                    transactionRecord.setPaymentTime(new Date());
-                    transactionRecord.setBuyType(payType);
-                    transactionRecord.setUpdateTime(new Date());
-
-                    transactionRecordService.update(transactionRecord);
-
-                    //将投保单状态改为待制单
-                    if(insuranceApplication!=null) {
-                        insuranceApplication.setStatus(PolicyStatus.PendingMakePolicy.getValue() + "");
-                        insuranceApplication.setUpdateTime(new Date());
-
-                        insuranceApplicationService.update(insuranceApplication);
-                    }
-
-                    InsurancePolicy insurancePolicy = applicationPolicyService.findFirstPolicyByApplicationId(insuranceApplication.getId());
-
-                    if (insurancePolicy!=null){
-                        insurancePolicy.setStatus(PolicyStatus.PendingMakePolicy.getValue() + "");
-                        insurancePolicy.setUpdateTime(new Date());
-
-                        insurancePolicyService.update(insurancePolicy);
-                    }
-
-//                    body.put("orderNo", orderNo);
-//                    body.put("backStatus", "回调成功");
-//                    body.put("backTime", new Date().getTime()/1000);
-                    status="success";
-                }else if(transactionRecord == null){
-                    message = "订单不存在";
-                    status = "fail";
-                }else if("20".equals(transactionRecord.getPaymentStatus())){
-                    message = "订单已支付";
-                    status = "success";
+                transactionRecord.setPaymentStatus("20");
+                transactionRecord.setPaymentTime(new Date());
+                transactionRecord.setBuyType(payType);
+                transactionRecord.setUpdateTime(new Date());
+
+                transactionRecordService.update(transactionRecord);
+
+                //将投保单状态改为待制单
+                if (insuranceApplication != null) {
+                    insuranceApplication.setStatus(PolicyStatus.PendingMakePolicy.getValue() + "");
+                    insuranceApplication.setUpdateTime(new Date());
+
+                    insuranceApplicationService.update(insuranceApplication);
                 }
-            }else{
-                message = "签名不正确";
-                status = "fail";
+
+                //todo 处理合并投保单
+                processCombinePolicy(insuranceApplication);
+
+                message = "订单已支付";
+                status = "success";
             }
+        }
+        catch(Exception ex){
+            //在实际开发中,我们往往需要在方法中进行异常的捕获,从而对异常进行判断,为客户端返回提示信息。
+            //但是此时由于异常的被捕获,导致事务的回滚没有被触发,导致事务的失败。
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 
-        }else{
-            message = "订单号不存在";
             status = "fail";
+            message = ex.getMessage();
         }
 
         retMap.put("status", status);
         retMap.put("message", message);
-//      retMap.put("body", body);
 
         return retMap;
     }
 
+    private void processCombinePolicy(InsuranceApplication insuranceApplication) {
+        InsurancePolicy firstPolicy = applicationPolicyService.findFirstPolicyByApplicationId(insuranceApplication.getId());
+
+        if (firstPolicy != null) {
+            //先更新状态为待制单
+            firstPolicy.setStatus(PolicyStatus.PendingMakePolicy.getValue() + "");
+            firstPolicy.setUpdateTime(new Date());
+
+            insurancePolicyService.update(firstPolicy);
+        }
+
+        //todo 相同企业、相同险种、相同生效时间段 是否已经有投保单
+//        List<InsurancePolicy> policyList = insurancePolicyService.findNextMonthPolicy(
+//                insuranceApplication.getCompanyId(),
+//                firstPolicy.getDefinitionId(),
+//                firstPolicy.getStartTime(),
+//                insuranceApplication.getEndTime(),
+//                new String[]{PolicyStatus.Draft.getValue() + "",PolicyStatus.Back.getText() + ""});
+
+//        for(InsurancePolicy policy : policyList) {
+//            if(!policy.getId().equals(firstPolicy.getId())) {
+//                //todo 将相同企业、相同险种、相同生效时间段的当月投保单取出,准备合并
+//                curMonthPolicy = policyList.get(0);
+//                break;
+//            }
+//        }
+
+        InsurancePolicy combinePolicy = null;
+
+        if(StringUtils.isNotEmpty(insuranceApplication.getCombinePolicyId())) {
+            combinePolicy = insurancePolicyService.get(insuranceApplication.getCombinePolicyId());
+        }
+
+        if (combinePolicy != null) {
+            //todo 关联参保人员
+            List<InsurancePolicyMember> memberList = insurancePolicyMemberService.findByPolicyId(firstPolicy.getId());
+
+            for (InsurancePolicyMember srcMember : memberList) {
+                //人员不重复
+                if (!insurancePolicyMemberService.exist(combinePolicy.getId(), srcMember.getMemberId())) {
+                    InsurancePolicyMember destMember = new InsurancePolicyMember();
+
+                    destMember.setId(UUID.randomUUID().toString());
+                    destMember.setPolicyId(combinePolicy.getId());
+                    destMember.setMemberId(srcMember.getMemberId());
+                    destMember.setDelFlag(false);
+                    destMember.setCreateTime(new Date());
+                    destMember.setStatus(srcMember.getStatus());
+
+                    insurancePolicyMemberService.insert(destMember);
+                }
+            }
+
+            insurancePolicyService.updatePolicyNumAndAmount(combinePolicy, null);
+
+            //todo 因为已合并,将当前投保申请单、当前每月投保单设为false
+            insuranceApplication.setDelFlag(false);
+            insuranceApplication.setUpdateTime(new Date());
+            insuranceApplicationService.update(insuranceApplication);
+
+            firstPolicy.setDelFlag(false);
+            firstPolicy.setUpdateTime(new Date());
+            insurancePolicyService.update(firstPolicy);
+        }
+    }
+
     @GetMapping(value="/paySuccess")
     @ApiOperation(value="返回前端")
     public String paySuccess(){