소스 검색

feat: 增加额外的对账接口,前端只传入少量必填数据

suntg 6 년 전
부모
커밋
4da9154f12

+ 40 - 0
src/main/java/com/uas/platform/b2b/mall2/controller/SaleApcCheckController.java

@@ -0,0 +1,40 @@
+package com.uas.platform.b2b.mall2.controller;
+
+import com.uas.platform.b2b.core.util.URLDecoderUtils;
+import com.uas.platform.b2b.model.PurchaseApCheck;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
+import com.uas.platform.core.util.serializer.FlexJsonUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author suntg
+ * @date ${date}
+ */
+@Controller("mall2.SaleApCheckController")
+@RequestMapping("/mall2/sale/apCheck")
+public class SaleApcCheckController {
+
+    @Autowired
+    private PurchaseApCheckService purchaseApCheckService;
+
+    /**
+     * 保存生成的应收对账单主记录
+     *
+     * @param json 前台对账json
+     * @return ModelMap 封装成功信息以及异常信息
+     */
+    @RequestMapping(value = "/operation/save", method = RequestMethod.POST)
+    public ModelMap saveApCheck(@RequestBody String json) throws UnsupportedEncodingException {
+        json = URLDecoderUtils.decode(json, "UTF-8");
+        PurchaseApCheck apCheck = FlexJsonUtils.fromJson(json, PurchaseApCheck.class);
+        return purchaseApCheckService.checkCountWithSimpleDetail(apCheck);
+    }
+
+}

+ 8 - 0
src/main/java/com/uas/platform/b2b/service/ErpProdIODetailService.java

@@ -100,4 +100,12 @@ public interface ErpProdIODetailService {
      * @return 统计结果
      */
     List<ApCheckAmount> countSendAmounts(List<ErpProdIODetail> details);
+
+    /**
+     * 根据id获取验收明细
+     * @param sourceTable
+     * @param sourceId
+     * @return
+     */
+    List<ErpProdIODetail> getBySourceTableAndSourceId(String sourceTable, Long sourceId);
 }

+ 7 - 0
src/main/java/com/uas/platform/b2b/service/PurchaseApCheckService.java

@@ -306,4 +306,11 @@ public interface PurchaseApCheckService {
      * @param vendorList 供应商信息
      */
     void updateCheckByVendorInfo(List<VendorInfo> vendorList);
+
+	/**
+	 * 确认对账,明细只传简要信息,sourceTable & sourceId
+	 * @param apCheck
+	 * @return
+	 */
+	ModelMap checkCountWithSimpleDetail(PurchaseApCheck apCheck);
 }

+ 184 - 7
src/main/java/com/uas/platform/b2b/service/impl/ErpProdIODetailServiceImpl.java

@@ -8,13 +8,7 @@ import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckItemInfoDao;
 import com.uas.platform.b2b.dao.VendorDao;
-import com.uas.platform.b2b.model.ApcheckKeyWord;
-import com.uas.platform.b2b.model.DateFilter;
-import com.uas.platform.b2b.model.ErpProdIODetail;
-import com.uas.platform.b2b.model.ErpProdIo;
-import com.uas.platform.b2b.model.ProductIoGroup;
-import com.uas.platform.b2b.model.PurchaseApCheckItemInfo;
-import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.publicapi.model.ApCheckAmount;
 import com.uas.platform.b2b.service.ErpProdIODetailService;
 import com.uas.platform.b2b.service.PurchaseApCheckService;
@@ -30,6 +24,7 @@ import org.apache.axis.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.Id;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Root;
@@ -817,4 +812,186 @@ public class ErpProdIODetailServiceImpl implements ErpProdIODetailService {
         }
         return commonDao.query(sql.toString(), ErpProdIODetail.class);
     }
+
+    /**
+     * 获取待对账的委外验退单
+     *
+     * @param id 明细id
+     * @return 委外验退单
+     */
+    private List<ErpProdIODetail> getMakeReturnById(Long id) {
+        StringBuffer sql = new StringBuffer("select  mr_code as inoutno, mr_date as pidate, mr_rate as rate, mr_receivecode as receivecode, " +
+                "mr_receivename as receivename, '客户委外验退单' as piclass, 'make$returnitem' as sourcetable, ma_code as ordercode, 0 as orderdetno, " +
+                "mri_number as detno,  (-(1) *  mri_qty ) as qty, mri_orderpice as orderprice, mr_currency as currency, mri_taxrate as taxrate, " +
+                "mri_whname as whname, mri_ycheckqty as ycheckqty, make$orders.pr_code as prodcode, make$orders.pr_spec as prodspec, " +
+                "make$orders.pr_title as prodtitle, make$orders.pr_unit as produnit, " +
+                "((-(1) *  mri_qty ) - coalesce(mri_ycheckqty, 0)) as thischeckqty, mr_enuu as custuu, ma_useruu custuseruu, mr_venduu as enuu, mri_id as sourceid, " +
+                "mr_sendcode as sendcode, ma_factory as pd_factory, en_name custname, mri_payment payment from make$return  " +
+                "join make$returnitem on mr_id =  mri_paid " +
+                "join make$orders on mri_odid = ma_id  " +
+                "left join sec$enterprises on mr_enuu = en_uu " +
+                " where mri_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的委外验收单
+     *
+     * @param id 明细id
+     * @return 委外验收单
+     */
+    private List<ErpProdIODetail> getMakeAcceptById(Long id) {
+        StringBuffer sql = new StringBuffer("select  make$accept.ma_code as inoutno, make$accept.ma_date as pidate, make$accept.ma_rate as rate, " +
+                "ma_receivecode as receivecode, ma_receivename as receivename, '客户委外验收单' as piclass, 'make$acceptitem' as sourcetable, " +
+                "make$orders.ma_code as ordercode, 0 as orderdetno, mai_number as detno, mai_qty as qty, mai_orderpice as orderprice, " +
+                "make$accept.ma_currency as currency, mai_taxrate as taxrate, mai_whname as whname, mai_ycheckqty as ycheckqty, " +
+                "make$orders.pr_code as prodcode, make$orders.pr_spec as prodspec, make$orders.pr_title as prodtitle, make$orders.pr_unit as produnit, " +
+                "(mai_qty - coalesce(mai_ycheckqty, 0)) as thischeckqty, make$accept.ma_enuu as custuu, make$orders.ma_useruu custuseruu, make$accept.ma_venduu as enuu, " +
+                "mai_id as sourceid, ma_sendcode as sendcode, ma_factory as factory, en_name custname, mai_payment payment from make$accept " +
+                "join make$acceptitem on make$accept.ma_id = mai_paid " +
+                "join make$orders on mai_odid = make$orders.ma_id " +
+                "left join sec$enterprises on make$accept.ma_enuu = en_uu " +
+                "where mai_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户不良品出库单
+     *
+     * @param id 明细id
+     * @return 客户不良品出库单
+     */
+    private List<ErpProdIODetail> getBadOutById(Long id) {
+        StringBuffer sql = new StringBuffer("select  po_code as inoutno, po_date as pidate, po_rate as rate, po_receivecode as receivecode, " +
+                "po_receivename as receivename, '客户不良品出库单' as piclass, 'purc$badoutitem' as sourcetable, pu_code as pd_ordercode, " +
+                "purc$orderitems.pd_number as orderdetno, poi_number as detno, (-(1) * poi_qty ) as qty, 0 as pd_orderprice, po_currency as currency, " +
+                "poi_taxrate as taxrate, poi_whname as whname, poi_ycheckqty as ycheckqty, pr_code as prodcode, pr_spec as prodspec, pr_title as prodtitle, pr_unit as produnit, " +
+                "((-(1) * poi_qty ) - coalesce( poi_ycheckqty, 0)) as thischeckqty, po_enuu as custuu, pu_useruu custuseruu, po_venduu as enuu, poi_id as sourceid, " +
+                "po_sendcode as sendcode, purc$orderitems.pd_factory as factory, en_name custname, poi_payment payment from purc$badout " +
+                "join purc$badoutitem on po_id = poi_poid  " +
+                "left join purc$orderitems on poi_pdid = pd_id " +
+                "left join purc$orders on pu_id = pd_puid " +
+                "left join sec$enterprises on po_enuu = en_uu " +
+                "where poi_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户不良品入库单
+     *
+     * @param id 明细id
+     * @return 客户不良品入库单
+     */
+    private List<ErpProdIODetail> getBadInById(Long id) {
+        StringBuffer sql = new StringBuffer("select pb_code as inoutno, pb_date as pidate, pb_rate as rate, pb_receivecode as receivecode, " +
+                "pb_receivename as receivename, '客户不良品入库单' as piclass, 'purc$badinitem' as sourcetable, pu_code as ordercode, " +
+                "pd_number as orderdetno, pbi_number as detno, pbi_qty as qty, 0 as pd_orderprice, pb_currency as currency, pbi_taxrate as taxrate, " +
+                "pbi_whname as whname, pbi_ycheckqty as ycheckqty, pr_code as prodcode, pr_spec as prodspec, pr_title as prodtitle, pr_unit as produnit, " +
+                "(pbi_qty - coalesce(pbi_ycheckqty, 0)) as thischeckqty, pb_enuu as custuu, pu_useruu custuseruu, pb_venduu as enuu, pbi_id as sourceid, " +
+                "pb_sendcode as sendcode, pd_factory as factory, en_name custname, pbi_payment payment from purc$badin " +
+                "join purc$badinitem on pb_id = pbi_pbid " +
+                "left join purc$orderitems on pbi_pdid = pd_id " +
+                "left join purc$orders on pu_id = pd_puid " +
+                "left join sec$enterprises on pb_enuu = en_uu " +
+                "where pbi_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户采购验退单信息
+     *
+     * @param id 明细id
+     * @return 客户采购验退单信息
+     */
+    private List<ErpProdIODetail> getSaleReturnById(Long id) {
+        StringBuffer sql = new StringBuffer("select purc$return.pr_code as inoutno, pr_date as pidate, pr_rate as rate, pr_receivecode as receivecode, " +
+                "pr_receivename as receivename, '客户采购验退单' as piclass, 'purc$returnitem' as sourcetable, pu_code as ordercode, pd_number as orderdetno, " +
+                "pri_number as detno, (-(1) * pri_qty ) as qty, pri_orderprice as orderprice, pr_currency as currency, pri_taxrate as taxrate, " +
+                "pri_whname as whname, purc$returnitem.pr_code as prodcode, purc$returnitem.pr_spec as prodspec, purc$returnitem.pr_title as prodtitle, purc$returnitem.pr_unit as produnit, " +
+                "pri_ycheckqty as ycheckqty, ((-(1) * pri_qty ) - coalesce(pri_ycheckqty, 0)) as thischeckqty, pr_enuu as custuu, pu_useruu custuseruu, pr_venduu as enuu, " +
+                "pri_id as sourceid, pr_sendcode as sendcode, pd_factory as factory, en_name custname, pri_payment payment from purc$return " +
+                "join purc$returnitem on pr_id = pri_prid " +
+                "left join purc$orderitems on pri_pdid = pd_id " +
+                "left join purc$orders on pu_id = pd_puid " +
+                "left join sec$enterprises on pr_enuu = en_uu " +
+                "where pri_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的客户采购验收单信息
+     *
+     * @param id 明细id
+     * @return 客户采购验收单信息
+     */
+    private List<ErpProdIODetail> getSaleAcceptById(Long id) {
+        StringBuilder sql = new StringBuilder("select pa_code as inoutno, pa_date as pidate, pa_rate as rate, pa_receivecode as receivcode, pa_receivename as receivename, '客户采购验收单' as piclass, 'purc$acceptitem' as sourcetable, pu_code as ordercode," +
+                " pd_number as orderdetno, pai_number as detno, pai_qty as qty, pai_orderprice as orderprice, pa_currency as currency," +
+                " pai_taxrate as taxrate,  pai_whname as whname, purc$acceptitem.pr_code as prodcode, purc$acceptitem.pr_spec as prodspec, purc$acceptitem.pr_unit as produnit," +
+                " purc$acceptitem.pr_title as prodtitle, pai_ycheckqty as ycheckqty, (pai_qty - coalesce(pai_ycheckqty, 0)) as thischeckqty," +
+                " pa_enuu as custuu, pu_useruu custuseruu, pa_venduu as enuu, pai_id as sourceid, pa_sendcode as sendcode, pd_factory as factory, en_name custname," +
+                " pai_payment payment, b2b_si_id sendId,si_price sendPrice,si_qty sendQty from purc$accept" +
+                " join purc$acceptitem on pai_paid = pa_id" +
+                " left join purc$orderitems on pai_pdid = pd_id" +
+                " left join purc$orders on purc$orders.pu_id = pd_puid" +
+                " left join sec$enterprises on pa_enuu = en_uu" +
+                " left join sale$senditem on b2b_si_id = si_id" +
+                " where pai_id =").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 获取待对账的货款调账信息
+     *
+     * @param id 明细id
+     * @return 货款调账信息
+     */
+    private List<ErpProdIODetail> getAdjustmentByid(Long id) {
+        StringBuffer sql = new StringBuffer("select aa_inoutno inoutno, aa_orderdate pidate, aa_rate rate, aa_receivecode receivecode, " +
+                "aa_receivename receivename, '货款调账' as piclass, 'purc$apbilladjustment' as sourcetable, aa_ordercode ordercode, " +
+                "aa_orderdetno orderdetno, aa_detno detno, aa_prid prid, aa_prodcode prodcode, aa_prodspec prodspec, aa_prodtitle prodtitle, aa_produnit as produnit, " +
+                "aa_qty qty, aa_orderprice orderprice, aa_currency currency, aa_taxrate taxrate, aa_whname whname, aa_ycheckqty ycheckqty, " +
+                "(aa_qty - coalesce(aa_ycheckqty, 0)) as thischeckqty, aa_custuu custuu, aa_custuseruu custuseruu, aa_enuu enuu, aa_id sourceid, aa_sendcode sendcode, " +
+                "aa_factory factory, aa_custname custname, aa_payment payment from purc$apbilladjustment" +
+                " where aa_id = ").append(id);
+        return commonDao.query(sql.toString(), ErpProdIODetail.class);
+    }
+
+    /**
+     * 根据id获取验收明细
+     *
+     * @param sourceTable
+     * @param sourceId
+     * @return
+     */
+    @Override
+    public List<ErpProdIODetail> getBySourceTableAndSourceId(String sourceTable, Long sourceId) {
+        List<ErpProdIODetail> erpProdIODetails = new ArrayList<>();
+        switch (sourceTable) {
+            case ApCheckTable.ADJUSTMENT:
+                erpProdIODetails = getAdjustmentByid(sourceId);
+                break;
+            case ApCheckTable.MAKE_ACCEPT:
+                erpProdIODetails = getMakeAcceptById(sourceId);
+                break;
+            case ApCheckTable.MAKE_RETURN:
+                erpProdIODetails = getMakeReturnById(sourceId);
+                break;
+            case ApCheckTable.SALE_ACCEPT:
+                erpProdIODetails = getSaleAcceptById(sourceId);
+                break;
+            case ApCheckTable.SALE_BADIN:
+                erpProdIODetails = getBadInById(sourceId);
+                break;
+            case ApCheckTable.SALE_BADOUT:
+                erpProdIODetails = getBadOutById(sourceId);
+                break;
+            case ApCheckTable.SALE_RETURN:
+                erpProdIODetails = getSaleReturnById(sourceId);
+                break;
+            default:
+                break;
+        }
+        return erpProdIODetails;
+    }
 }

+ 70 - 14
src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java

@@ -14,20 +14,7 @@ import com.uas.platform.b2b.dao.PurchaseApCheckItemDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckTodoDao;
 import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.erp.model.VendorInfo;
-import com.uas.platform.b2b.model.ApCheckTable;
-import com.uas.platform.b2b.model.CommunalLog;
-import com.uas.platform.b2b.model.DateFilter;
-import com.uas.platform.b2b.model.Enterprise;
-import com.uas.platform.b2b.model.OrderRedDotAll;
-import com.uas.platform.b2b.model.OrderType;
-import com.uas.platform.b2b.model.PurcApCheck;
-import com.uas.platform.b2b.model.PurchaseApCheck;
-import com.uas.platform.b2b.model.PurchaseApCheckDone;
-import com.uas.platform.b2b.model.PurchaseApCheckItem;
-import com.uas.platform.b2b.model.PurchaseApCheckTodo;
-import com.uas.platform.b2b.model.SearchFilter;
-import com.uas.platform.b2b.model.SourceForApcheck;
-import com.uas.platform.b2b.model.Vendor;
+import com.uas.platform.b2b.model.*;
 import com.uas.platform.b2b.model.util.ApCheckAllCountSqls;
 import com.uas.platform.b2b.model.util.ApCheckDoneCountSqls;
 import com.uas.platform.b2b.model.util.ApCheckTodoCountSqls;
@@ -1228,4 +1215,73 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
             communalLogDao.save(log);
         }
     }
+
+	/**
+	 * 确认对账,明细只传简要信息,sourceTable & sourceId
+	 *
+	 * @param apCheck
+	 * @return
+	 */
+	@Override
+	public ModelMap checkCountWithSimpleDetail(PurchaseApCheck apCheck) {
+		boolean first = true;
+		double checkAmount = 0;
+		for (PurchaseApCheckItem apCheckItem : apCheck.getItems()) {
+			List<ErpProdIODetail> erpProdIODetails = erpProdIODetailService.getBySourceTableAndSourceId(apCheckItem.getSourceTable(), apCheckItem.getSourceId());
+			if(CollectionUtils.isEmpty(erpProdIODetails)) {
+				ErpProdIODetail erpProdIODetail = erpProdIODetails.get(0);
+				// 赋值明细
+				convertErpProdIODetail(apCheckItem, erpProdIODetail);
+				// 计算总金额
+				checkAmount += apCheckItem.getAmount();
+				// 赋值主表
+				if (first) {
+					apCheck.setCustUu(erpProdIODetail.getCustuu());
+					apCheck.setCustName(erpProdIODetail.getCustname());
+					apCheck.setApDate(erpProdIODetail.getPidate());
+					apCheck.setCheckStatus("未对账");
+					apCheck.setCurrency(erpProdIODetail.getCurrency());
+					apCheck.setRate(erpProdIODetail.getRate());
+					apCheck.setTaxrate(erpProdIODetail.getTaxrate());
+				}
+				first = false;
+			} else {
+				throw new IllegalOperatorException("无效的明细数据:" + apCheckItem.getSourceTable() + ", " + apCheckItem.getSourceId());
+			}
+		}
+		apCheck.setCheckAmount(checkAmount);
+		return checkCount(apCheck);
+	}
+
+	/**
+	 * 将ErpProdIODetail的信息赋值给PurchaseApCheckItem
+	 * @param apCheckItem
+	 * @param erpProdIODetail
+	 */
+	private void convertErpProdIODetail(PurchaseApCheckItem apCheckItem, ErpProdIODetail erpProdIODetail) {
+		apCheckItem.setInoutno(erpProdIODetail.getInoutno());
+		apCheckItem.setInoutnodetno(erpProdIODetail.getDetno());
+		apCheckItem.setOrderCode(erpProdIODetail.getOrdercode());
+		apCheckItem.setOrderClass(erpProdIODetail.getPiclass());
+		apCheckItem.setOrderDetno(erpProdIODetail.getOrderdetno());
+		apCheckItem.setPrice(erpProdIODetail.getOrderprice());
+		apCheckItem.setCheckQty(erpProdIODetail.getThischeckqty());
+		apCheckItem.setAmount((erpProdIODetail.getThischeckqty() == null ? 0 : erpProdIODetail.getThischeckqty()) *
+				(erpProdIODetail.getOrderprice() == null ? 0 : erpProdIODetail.getOrderprice()));
+		apCheckItem.setStatus(0);
+		apCheckItem.setReceiveName(erpProdIODetail.getReceivename());
+		apCheckItem.setReceiveCode(erpProdIODetail.getReceivecode());
+		apCheckItem.setProdCode(erpProdIODetail.getProdcode());
+		apCheckItem.setProdTitle(erpProdIODetail.getProdtitle());
+		apCheckItem.setProdSpec(erpProdIODetail.getProdspec());
+		apCheckItem.setProdUnit(erpProdIODetail.getProdunit());
+		apCheckItem.setTaxrate(erpProdIODetail.getTaxrate());
+		apCheckItem.setSendcode(erpProdIODetail.getSendcode());
+		apCheckItem.setWhname(erpProdIODetail.getWhname());
+		apCheckItem.setCustUserUU(erpProdIODetail.getCustuseruu());
+		apCheckItem.setSendId(erpProdIODetail.getSendId());
+		apCheckItem.setSendQty(erpProdIODetail.getSendQty());
+		apCheckItem.setSendPrice(erpProdIODetail.getSendPrice());
+		apCheckItem.setSourceDate(erpProdIODetail.getPidate());
+	}
 }