zouxuan 5 rokov pred
rodič
commit
7495e8fc2d

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/GoodsDao.java

@@ -135,4 +135,12 @@ public interface GoodsDao extends BaseDAO<Integer, Goods> {
     List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscount(@Param("subjectId") Integer subjectId, @Param("type") String type);
 
     List<MusicGroupGoodsAndDiscountDto> getMusicGroupGoodsAndDiscountWithSubjects(@Param("subjectIds") String subjectIds, @Param("type") String type);
+
+    /**
+     * 是否存在已上架的商品编号
+     * @param goodsId
+     * @param status
+     * @return
+     */
+    Boolean findByIdAndStatus(@Param("goodsId") String goodsId, @Param("status") int status);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.OrderDetailTypeEnum;
@@ -352,4 +353,11 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
      * @return
      */
     List<StudentPaymentOrder> getUserOrderByType(@Param("userId") Integer userId, @Param("type") OrderTypeEnum type, @Param("status") DealStatusEnum status);
+
+    /**
+     * 批量新增
+     * @author zouxuan
+     * @param studentPaymentRouteOrders
+     */
+    int batchInsert(@Param("studentPaymentRouteOrders") List<StudentPaymentRouteOrder> studentPaymentRouteOrders);
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentRouteOrderDao.java

@@ -59,4 +59,11 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
      * @return
      */
     int insertOrder(StudentPaymentOrder order);
+
+    /**
+     * 是否有重复到订单号
+     * @param transNos
+     * @return
+     */
+    List<String> countByTransNo(List<Object> transNos);
 }

+ 21 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentRouteOrder.java

@@ -52,6 +52,10 @@ public class StudentPaymentRouteOrder {
     
     private String memo;
     
+    private String goodsIds;
+
+    private String goodsNums;
+
     private String goodsJson;
     
     private AuditStatusEnum auditStatus;
@@ -66,7 +70,23 @@ public class StudentPaymentRouteOrder {
     
     private Integer updateBy;
 
-    public Long getId() {
+	public String getGoodsIds() {
+		return goodsIds;
+	}
+
+	public void setGoodsIds(String goodsIds) {
+		this.goodsIds = goodsIds;
+	}
+
+	public String getGoodsNums() {
+		return goodsNums;
+	}
+
+	public void setGoodsNums(String goodsNums) {
+		this.goodsNums = goodsNums;
+	}
+
+	public Long getId() {
         return id;
     }
 

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TemplateTypeEnum.java

@@ -4,6 +4,7 @@ import com.ym.mec.common.enums.BaseEnum;
 
 public enum TemplateTypeEnum implements BaseEnum<String, TemplateTypeEnum> {
     GOODS("GOODS","商品导入模板"),
+    ROUTE_ORDER("ROUTE_ORDER","财务订单管理导入模板"),
     FINANCIAL_EXPENDITURE("FINANCIAL_EXPENDITURE","财务支出导入模板");
 
     private String code;

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentRouteOrderService.java

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service;
 
 
 import java.math.BigDecimal;
+import java.util.List;
 
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.dto.StudentPaymentRouteOrderDto;
@@ -9,6 +10,7 @@ import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.common.service.BaseService;
+import org.springframework.web.multipart.MultipartFile;
 
 
 public interface StudentPaymentRouteOrderService extends BaseService<Long, StudentPaymentRouteOrder> {
@@ -55,4 +57,11 @@ public interface StudentPaymentRouteOrderService extends BaseService<Long, Stude
 	 */
 	Boolean deleteRouteOrder(Long orderId);
 
+	/**
+	 * 财务管理订单导入
+	 * @author zouxuan
+	 * @param file
+	 * @return
+	 */
+    List<StudentPaymentRouteOrder> importRouteOrder(MultipartFile file) throws Exception;
 }

+ 133 - 16
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -1,16 +1,21 @@
 package com.ym.mec.biz.service.impl;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
+import com.alibaba.fastjson.JSONArray;
+import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.IniFileUtil;
+import com.ym.mec.util.excel.POIUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -24,17 +29,6 @@ import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dto.PageInfoOrder;
 import com.ym.mec.biz.dal.dto.StudentPaymentRouteOrderDto;
-import com.ym.mec.biz.dal.entity.Goods;
-import com.ym.mec.biz.dal.entity.SellOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
-import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
-import com.ym.mec.biz.dal.enums.AccountType;
-import com.ym.mec.biz.dal.enums.AuditStatusEnum;
-import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.dal.enums.GroupType;
-import com.ym.mec.biz.dal.enums.OrderTypeEnum;
-import com.ym.mec.biz.dal.enums.SellTypeEnum;
-import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.GoodsService;
 import com.ym.mec.biz.service.SellOrderService;
@@ -44,6 +38,7 @@ import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
+import org.springframework.web.multipart.MultipartFile;
 
 @Service
 public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, StudentPaymentRouteOrder> implements StudentPaymentRouteOrderService {
@@ -292,4 +287,126 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
         return true;
     }
 
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public List<StudentPaymentRouteOrder> importRouteOrder(MultipartFile file) throws Exception{
+		Map<String, List<Map<String, Object>>> sheetsListMap = POIUtil.importExcel(new ByteArrayInputStream(file.getBytes()), 2, file.getOriginalFilename());
+		InputStream inputStream = new ClassPathResource("columnMapper.ini").getInputStream();
+		Map<String,String> columns = IniFileUtil.readIniFile(inputStream, TemplateTypeEnum.ROUTE_ORDER.getMsg());
+		List<StudentPaymentRouteOrder> studentPaymentRouteOrders = new ArrayList<>();
+		Map<String, Integer> organMap = getMap("organization", "name_", "id_", true, String.class, Integer.class);
+		Map<String, Integer> cooperationOrganMap = getMap("cooperation_organ", "name_", "id_", true, String.class, Integer.class);
+		for (String e : sheetsListMap.keySet()) {
+			List<Map<String, Object>> sheet = sheetsListMap.get(e);
+			List<Object> collect = sheet.stream().map(m -> m.get("交易流水号")).collect(Collectors.toList());
+			if(collect == null || collect.size() == 0){
+				continue;
+			}
+			List<String> list = studentPaymentRouteOrderDao.countByTransNo(collect);
+			if(list != null && list.size() > 0){
+				throw new BizException("导入数据错误  重复的交易流水号:{}",list.get(0));
+			}
+
+			valueIsNull: for (Map<String, Object> row : sheet) {
+
+				if (row.size() == 0){
+					continue;
+				}
+				JSONObject objectMap = new JSONObject();
+				for (String s : row.keySet()) {
+					if(!columns.containsKey(s)){
+						continue;
+					}
+					String columnValue = columns.get(s);
+					if (columnValue.equals("transNo")) {
+						if(StringUtils.isEmpty(row.get(s).toString())){
+							continue valueIsNull;
+						}
+					}
+					if (columnValue.equals("merNo")) {
+						if(StringUtils.isEmpty(row.get(s).toString())){
+							continue valueIsNull;
+						}else {
+							objectMap.put("merNo", row.get(s));
+						}
+						continue;
+					}
+					if (columnValue.equals("organName") && StringUtils.isNotEmpty(row.get(s).toString())) {
+						Integer integer = organMap.get(row.get(s));
+						if(integer == null){
+							continue valueIsNull;
+						}else {
+							objectMap.put("routeOrganId", integer);
+						}
+						continue;
+					}
+					if (columnValue.equals("cooperationOrganName") && StringUtils.isNotEmpty(row.get(s).toString())) {
+						Integer integer = cooperationOrganMap.get(row.get(s));
+						if(integer != null){
+							objectMap.put("schoolId", integer);
+						}
+						continue;
+					}
+					if (columnValue.equals("payTime") && StringUtils.isNotEmpty(row.get(s).toString())) {
+						String toString = row.get(s).toString();
+						if(StringUtils.isNotEmpty(toString)){
+							Date date = DateUtil.stringToDate(toString, DateUtil.DEFAULT_PATTERN);
+							if(date == null){
+								throw new BizException("导入数据错误  交易日期格式错误");
+							}else {
+								objectMap.put(columnValue, DateUtil.format(date,DateUtil.DEFAULT_PATTERN));
+							}
+						}
+						continue;
+					}
+					objectMap.put(columnValue, row.get(s));
+				}
+				StudentPaymentRouteOrder studentPaymentRouteOrder = null;
+				try {
+					studentPaymentRouteOrder = JSONObject.parseObject(objectMap.toJSONString(),StudentPaymentRouteOrder.class);
+					//是否有销售金额
+					if(studentPaymentRouteOrder.getSaleAmount() != null && studentPaymentRouteOrder.getSaleAmount().longValue() != 0l){
+						String goodsIds = studentPaymentRouteOrder.getGoodsIds();
+						String goodsNums = studentPaymentRouteOrder.getGoodsNums();
+						if(StringUtils.isAllEmpty(goodsIds,goodsNums)){
+							throw new BizException("导入失败:有销售金额时商品编号和数量必填");
+						}
+						List<String> goodsIdList = new ArrayList(Arrays.asList(goodsIds.split(",")));
+						List<String> goodsNumList = new ArrayList(Arrays.asList(goodsNums.split(",")));
+						if(goodsIdList.size() != goodsNumList.size()){
+							throw new BizException("导入失败:商品编号和商品数量不一致");
+						}
+						JSONArray goodsJSON = new JSONArray();
+						for (int i = 0; i < goodsIdList.size(); i++) {
+							if(!goodsDao.findByIdAndStatus(goodsIdList.get(i), 1)){
+								throw new BizException("导入失败:商品编号{}不存在",goodsIdList.get(i));
+							}
+							try {
+								int goodsNum = Integer.parseInt(goodsNumList.get(i));
+								JSONObject jsonObject = new JSONObject();
+								jsonObject.put(goodsIdList.get(i),goodsNum);
+								goodsJSON.add(jsonObject);
+							}catch (Exception e1){
+								throw new BizException("导入失败:商品数量{}填写错误",goodsNumList.get(i));
+							}
+						}
+						studentPaymentRouteOrder.setGoodsJson(goodsJSON.toJSONString());
+					}
+					studentPaymentRouteOrders.add(studentPaymentRouteOrder);
+				} catch (Exception ex) {
+					throw new BizException("导入数据出错,请检查Excel表格");
+				}
+			}
+		}
+		if(studentPaymentRouteOrders.size() != 0){
+			Map<String, List<StudentPaymentRouteOrder>> stringListMap = studentPaymentRouteOrders.stream().collect(Collectors.groupingBy(StudentPaymentRouteOrder::getOrderNo));
+			if(sheetsListMap.size() != studentPaymentRouteOrders.size()){
+				throw new BizException("导入失败:请勿录入重复的交易流水号");
+			}
+			studentPaymentOrderDao.batchInsert(studentPaymentRouteOrders);
+		}
+		return studentPaymentRouteOrders;
+	}
+
 }

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/GoodsMapper.xml

@@ -387,4 +387,7 @@
             AND g.type_ = #{type}
         </if>
     </select>
+    <select id="findByIdAndStatus" resultType="java.lang.Boolean">
+        SELECT COUNT(0) FROM goods WHERE `status` = #{status} AND id_ = #{goodsId}
+    </select>
 </mapper>

+ 23 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -101,6 +101,29 @@
                 #{classGroupId}, #{payTime})
     </insert>
 
+    <!-- 向数据库增加一条记录 -->
+    <insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder" useGeneratedKeys="true"
+            keyColumn="id" keyProperty="id">
+        INSERT INTO student_payment_order
+        (group_type_, user_id_, organ_id_, routing_organ_id_, type_, expect_amount_, actual_amount_, com_amount_,
+         per_amount_,
+         balance_payment_amount_, remit_fee_, course_remit_fee_, trans_no_,
+         status_, memo_, create_time_, update_time_, payment_channel_, payment_business_channel_,
+         payment_account_no_, mer_nos_, order_no_, music_group_id_, class_group_id_, pay_time_)
+         VALUES
+         <foreach collection="studentPaymentRouteOrders" separator="," item="item">
+             (#{item.groupType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+             #{item.userId}, #{item.organId}, #{item.routingOrganId},
+             #{item.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+             #{item.expectAmount}, #{item.actualAmount}, #{item.comAmount}, #{item.perAmount}, #{item.balancePaymentAmount},
+             #{item.remitFee}, #{item.courseRemitFee}, #{item.transNo},
+             #{item.status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}, #{item.memo}, now(), now(),
+             #{item.paymentChannel}, #{item.paymentBusinessChannel}, #{item.paymentAccountNo}, #{item.merNos}, #{item.orderNo},
+             #{item.musicGroupId},
+             #{item.classGroupId}, #{item.payTime})
+         </foreach>
+    </insert>
+
     <!-- 根据主键查询一条记录 -->
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentOrder">
         UPDATE student_payment_order

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -276,6 +276,12 @@
         <include refid="queryPaymentOrder"/>
         ORDER BY spo.id_ ASC
     </select>
+    <select id="countByTransNo" resultType="java.lang.String">
+        SELECT order_no_ FROM student_payment_route_order WHERE trans_no_ IN
+        <foreach collection="transNos" open="(" close=")" item="orderNo" separator=",">
+            #{item}
+        </foreach>
+    </select>
 
     <delete id="deleteByOrderNo">
         DELETE

+ 11 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ImportController.java

@@ -4,9 +4,11 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.TemplateTypeEnum;
 import com.ym.mec.biz.service.FinancialExpenditureService;
 import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.util.date.DateUtil;
@@ -37,6 +39,8 @@ public class ImportController extends BaseController {
     private FinancialExpenditureService financialExpenditureService;
     @Autowired
     private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
 
     @ApiOperation(value = "导入商品")
     @PostMapping(value = "goods")
@@ -56,6 +60,13 @@ public class ImportController extends BaseController {
         return succeed(financialExpenditureService.importFinancialExpenditure(file));
     }
 
+    @ApiOperation(value = "导入财务管理订单")
+    @PostMapping(value = "routeOrder")
+    @PreAuthorize("@pcs.hasPermissions('import/routeOrder')")
+    public HttpResponseResult<List<StudentPaymentRouteOrder>> importRouteOrder(@RequestParam("file") MultipartFile file) throws Exception {
+        return succeed(studentPaymentRouteOrderService.importRouteOrder(file));
+    }
+
     @ApiOperation(value = "下载导入模板")
     @GetMapping(value = "downloadTemplate")
     @PreAuthorize("@pcs.hasPermissions('import/downloadTemplate')")

+ 3 - 3
mec-web/src/main/resources/columnMapper.ini

@@ -38,11 +38,11 @@
 [财务管理导入模板]
 所属分部 = organName
 所属学校 = cooperationOrganName
-交易流水号 = orderNo
+交易流水号 = transNo
 收款账户 = merNo
 交易日期 = payTime
 销售金额 = goodsAmount
 服务金额 = serviceAmount
-商品名称 = goodsId
-商品数量 = goodsNum
+商品名称 = goodsIds
+商品数量 = goodsNums
 备注 = memo