From d1de8446f9a0f1e661526ab6735118088ad7a64a Mon Sep 17 00:00:00 2001 From: xyiege Date: Mon, 28 Nov 2022 15:33:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=98=E6=AC=BE=E5=90=8E=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../szwh/controller/api/OrderController.java | 20 +- .../szwh/mapper/OrderGoodsDetailMapper.java | 8 + .../cn/chjyj/szwh/mapper/TicketMapper.java | 7 + .../cn/chjyj/szwh/service/OrderService.java | 7 + .../cn/chjyj/szwh/service/PayService.java | 13 + .../szwh/service/impl/OrderServiceImpl.java | 47 ++++ .../service/impl/OrderTaskServiceImpl.java | 2 +- .../szwh/service/impl/PayServiceImpl.java | 232 +++++++++++++++--- .../mapper/szwh/OrderGoodsDetailMapper.xml | 11 + .../resources/mapper/szwh/TiketMapper.xml | 29 ++- src/test/java/cn/chjyj/szwh/Taxtest.java | 31 +++ .../cn/chjyj/szwh/service/PayServiceTest.java | 16 ++ 12 files changed, 376 insertions(+), 47 deletions(-) create mode 100644 src/test/java/cn/chjyj/szwh/Taxtest.java diff --git a/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java b/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java index b08e9ff..a2d3afc 100644 --- a/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java +++ b/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java @@ -196,13 +196,29 @@ public class OrderController extends BaseController { * @return */ @RequestMapping("/getBalance") - public JSONObject getBalance() { + public JSONObject getBalance(@RequestBody String reqstr) { + log.info("orderController:"+reqstr); return jsonObject; + } + /** + * 订单结算回调 + * @return + */ @RequestMapping("/orderCloseCallback") - public JSONObject orderCloseCallback() { + public JSONObject orderCloseCallback(@RequestBody String reqstr) { + log.info("orderCloseCallback"+reqstr); + JSONObject reqjson = JSONObject.parseObject(reqstr); + String reqdata = reqjson.getString("data"); + //返回数据 + if(StringUtils.isBlank(reqdata)){ + log.error(reqjson+" 解析错误"); + } + //执行处理 + orderService.orderCloseCallback(reqdata); // 请求转发到远程服务器 + jsonObject.put("msg","成功"); return jsonObject; } diff --git a/src/main/java/cn/chjyj/szwh/mapper/OrderGoodsDetailMapper.java b/src/main/java/cn/chjyj/szwh/mapper/OrderGoodsDetailMapper.java index 7d5181e..e53ebd1 100644 --- a/src/main/java/cn/chjyj/szwh/mapper/OrderGoodsDetailMapper.java +++ b/src/main/java/cn/chjyj/szwh/mapper/OrderGoodsDetailMapper.java @@ -102,4 +102,12 @@ public interface OrderGoodsDetailMapper { * @return */ int addOrderGoodsDetail(OrderGoodsDetail orderGoodsDetail); + + /** + * 更新订单商品信息 + * @param map + * @param id + * @return + */ + int updateOrderGoodsDetail(@Param("map") Map map, @Param("id")Integer id); } diff --git a/src/main/java/cn/chjyj/szwh/mapper/TicketMapper.java b/src/main/java/cn/chjyj/szwh/mapper/TicketMapper.java index 26190dc..1c9fbee 100644 --- a/src/main/java/cn/chjyj/szwh/mapper/TicketMapper.java +++ b/src/main/java/cn/chjyj/szwh/mapper/TicketMapper.java @@ -35,4 +35,11 @@ public interface TicketMapper { * @return */ int countOrderTicket(Map map); + + /** + * 储存发票信息 + * @param ticket + * @return + */ + int addTicket(Ticket ticket); } diff --git a/src/main/java/cn/chjyj/szwh/service/OrderService.java b/src/main/java/cn/chjyj/szwh/service/OrderService.java index 35e7a39..ee19946 100644 --- a/src/main/java/cn/chjyj/szwh/service/OrderService.java +++ b/src/main/java/cn/chjyj/szwh/service/OrderService.java @@ -126,4 +126,11 @@ public interface OrderService { * @return */ Map buyCarGoods(String userIsli,JSONArray gJsonArray); + + /** + * 订单结算回调 + * @param cryptStr 待解密字符 + * @return + */ + int orderCloseCallback(String cryptStr); } diff --git a/src/main/java/cn/chjyj/szwh/service/PayService.java b/src/main/java/cn/chjyj/szwh/service/PayService.java index 82bcd24..612cf21 100644 --- a/src/main/java/cn/chjyj/szwh/service/PayService.java +++ b/src/main/java/cn/chjyj/szwh/service/PayService.java @@ -25,4 +25,17 @@ public interface PayService { */ public int payCallback(JSONObject jsonObject); + /** + * 买家发票信息 + * @param bathcode + * @return + */ + int invoiceBuyOperate(String bathcode); + + /** + * 卖家发票信息 + * @param bathcode + * @return + */ + int invoiceSellerOperate(String bathcode); } diff --git a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java index c9cd212..7a80e6a 100644 --- a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java +++ b/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java @@ -2,10 +2,13 @@ package cn.chjyj.szwh.service.impl; import cn.chjyj.szwh.bean.*; import cn.chjyj.szwh.constant.ChConstant; +import cn.chjyj.szwh.constant.PayConstant; import cn.chjyj.szwh.exception.ChException; import cn.chjyj.szwh.mapper.*; import cn.chjyj.szwh.service.OrderService; import cn.chjyj.szwh.utils.*; +import cn.chjyj.szwh.utils.pay.StringUtil; +import cn.chjyj.szwh.utils.pay.security.AesEncryption; import cn.chjyj.szwh.vo.OrderDetailVo; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; @@ -1052,6 +1055,50 @@ public class OrderServiceImpl implements OrderService { return outmap; } + //处理回调信息 + @Override + public int orderCloseCallback(String cryptStr) { + try { + String desencrypt = AesEncryption.Desencrypt(cryptStr, + PayConstant.TOKEN_SECRETKEY, PayConstant.TOKEN_SECRETKEY); + //转为json + JSONObject outjson = JSONObject.parseObject(desencrypt); + //结算批号 (订单号) + String ordernumber = outjson.getString("ordernumber"); + //支付流水号 + String payorderid = outjson.getString("payorderid"); + //结算状态 + int closeStatus =5; + //返回的信息 + String callMsg = outjson.getString("respmsg"); + //更新订单商品详情 + Map odmap = new HashMap(); + odmap.put("close_id",ordernumber); + odmap.put("close_status",closeStatus); + odmap.put("close_serial_number",payorderid); + odmap.put("callback_msg", StringUtils.isNotBlank(callMsg)?callMsg:"-"); + List ordglist = orderGoodsDetailMapper.getOrderGoodsDetailByBatchCode(ordernumber); + //todo 后续更改为更新订单编号 + for(OrderGoodsDetail odg:ordglist){ + //更新字段 + orderGoodsDetailMapper.updateOrderGoodsDetail(odmap,odg.getId()); + } + + //更新订单状态 + Map ordmap = new HashMap(); + ordmap.put("status",4); + Date curnow = new Date(); + ordmap.put("closetime",curnow); + ordmap.put("completetime",curnow); + Order order = orderMapper.getOrderByBatchcode(ordernumber); + orderMapper.updateOrderStatus(ordmap,order.getId()); + + }catch (Exception ex){ + log.error("支付结果解密异常:"+ex.getMessage()); + } + return 0; + } + /** * 结算 * diff --git a/src/main/java/cn/chjyj/szwh/service/impl/OrderTaskServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/OrderTaskServiceImpl.java index bfa5a47..02be341 100644 --- a/src/main/java/cn/chjyj/szwh/service/impl/OrderTaskServiceImpl.java +++ b/src/main/java/cn/chjyj/szwh/service/impl/OrderTaskServiceImpl.java @@ -43,7 +43,7 @@ public class OrderTaskServiceImpl implements OrderTaskService { String now=sdf.format(bdate); //组装查询条件 Map qmap =new HashMap<>(); - qmap.put("staus",1); + qmap.put("staus",3); qmap.put("createtime",now); List orderList= orderMapper.getOrderListUnderDate(now,"1"); // 判断非空 diff --git a/src/main/java/cn/chjyj/szwh/service/impl/PayServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/PayServiceImpl.java index de28c00..98baed6 100644 --- a/src/main/java/cn/chjyj/szwh/service/impl/PayServiceImpl.java +++ b/src/main/java/cn/chjyj/szwh/service/impl/PayServiceImpl.java @@ -1,16 +1,17 @@ package cn.chjyj.szwh.service.impl; -import cn.chjyj.szwh.bean.Goods; -import cn.chjyj.szwh.bean.Order; -import cn.chjyj.szwh.bean.OrderGoodsDetail; -import cn.chjyj.szwh.bean.OrderUser; -import cn.chjyj.szwh.mapper.GoodsMapper; -import cn.chjyj.szwh.mapper.OrderGoodsDetailMapper; -import cn.chjyj.szwh.mapper.OrderMapper; -import cn.chjyj.szwh.mapper.OrderUserMapper; +import cn.chjyj.szwh.bean.*; +import cn.chjyj.szwh.constant.ChConstant; +import cn.chjyj.szwh.mapper.*; +import cn.chjyj.szwh.service.IndexService; import cn.chjyj.szwh.service.PayService; +import cn.chjyj.szwh.utils.ProperUtils; +import cn.chjyj.szwh.utils.RequestUtils; import cn.chjyj.szwh.utils.SzwhApiUtils; +import cn.chjyj.szwh.utils.TaxUtils; import cn.chjyj.szwh.utils.pay.security.AesEncryption; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; @@ -36,6 +37,8 @@ public class PayServiceImpl implements PayService { //商品信息 @Autowired private GoodsMapper goodsMapper; + @Autowired + private TicketMapper ticketMapper; /** * 关闭七日以前的已经支付了的订单 @@ -67,9 +70,11 @@ public class PayServiceImpl implements PayService { if(order.getPayStatus()!=2){ // do nothing } + //订单状态 Integer status = order.getStatus(); Integer closeStatus= order.getCloseStatus(); Integer type =order.getType(); + //查询购买用户 String buyIslicode = order.getBuyIslicode(); //购买用户 OrderUser oduser = orderUserMapper.getUserOrder(batchcode,buyIslicode); @@ -77,11 +82,10 @@ public class PayServiceImpl implements PayService { Date paytime = order.getPaymenttime(); // 同步到其他平台 List syncList =new ArrayList<>(); + //商品对应的合约编号 + Map ccmap = new HashMap(); + // Calendar cal= Calendar.getInstance(); - - // 分配比例设置及详情 - - //订单商品详情 List orderGoodsDetailList = orderGoodsDetailMapper.getOrderGoodsDetailByBatchCode(batchcode); for(OrderGoodsDetail odgd:orderGoodsDetailList){ @@ -104,25 +108,105 @@ public class PayServiceImpl implements PayService { // } //合约关联编码(订单交易isli标识码) String contractcode=""; - if(StringUtils.isEmpty(odgd.getContractCode())){ -// $ratio_setting = AccountRatioSetting::where('is_deleted', 0)->where('status', 1)->find(); -// $entrust_ratio_detail = AccountRatioDetail::where('setting_id', $ratio_setting->id)->where('role_type', 1)->find(); -// $ratio = 0; -// $entrust_number = 0; -// if($entrust_ratio_detail['calculate'] == 1){ -// $entrust_number = $entrust_ratio_detail['ratio']; -// }else{ -// $entrust_number = $entrust_ratio_detail['amount']; -// } -// $ratio = round(1 - ($entrust_number / 100), 4); + if(StringUtils.isEmpty(odgd.getContractCode()) || "-".equals(odgd.getContractCode())){ String ratio="0.00"; // 远程获取查询对应的 islicode - SzwhApiUtils.getApplyLinkCode(odgd.getGoodsIslicode(),buyIslicode,ratio,transCount,dateStr,batchcode); + JSONObject aplinkCodeJson=SzwhApiUtils.getApplyLinkCode(odgd.getGoodsIslicode(), + buyIslicode,ratio,transCount,dateStr,batchcode); + log.info("订单合约编号:"+aplinkCodeJson); + JSONArray aparr = aplinkCodeJson.getJSONArray("data"); + JSONObject lkcjson = (JSONObject) aparr.get(0); + // 返回的值是 buyIslicode 为键名的内容 + contractcode = lkcjson.getString(buyIslicode); }else{ contractcode = odgd.getContractCode(); } + //合约关联编号,更新到订单商品详情中 + Map ogdmap= new HashMap(); + ogdmap.put("contract_code",contractcode); + orderGoodsDetailMapper.updateOrderGoodsDetail(ogdmap,odgd.getId()); + //订单商品详情id,为key, 合约编号为键值 + ccmap.put(odgd.getId(),contractcode); + //配置文件中读取渠道 + String channelIsli = ProperUtils.getSzwhProp("CHANNEL_ISLI"); + //构建同步map + Map syncmap = new HashMap(); + syncmap.put("userId",buyIslicode); + syncmap.put("requestIsliFlag",channelIsli); //渠道编号 + syncmap.put("goodsIslicode",odgd.getGoodsIslicode()); + syncmap.put("goodsName" ,odgd.getGoodsName()); + syncmap.put("orderIslicode" ,contractcode); + syncmap.put("batchcode",odgd.getBatchcode()); + syncmap.put("chargesType",odgd.getMoney()); + //委托周期 + String entrmonth=odgd.getContractualPeriod()==1?"永久":"一次性"; + syncmap.put("entrustMonth",entrmonth); + //委托类型 + String gentr = odgd.getGoodsEntrust()==1?"转让":"许可"; + syncmap.put("goodsEntrust" ,gentr); + syncmap.put("goodsOwnership",odgd.getGoodsOwnership()); + //商品类型 + String gtype =odgd.getGoodsType()==1?"文化资源数据":"文化数字内容"; + syncmap.put("goodsType",gtype); + syncmap.put("payStatus", 1); + syncmap.put("closeStatus" ,closeStatus-1); + syncmap.put("transactionCount",odgd.getTransactionCount()); + //订单类型 + String typeStr=""; + switch (type){ + case 1:typeStr="委托订单";break; + case 2:typeStr="认证订单";break; + default:typeStr="服务订单";break; + } + syncmap.put("type",typeStr); + syncmap.put("buyUsername",buyName); + syncmap.put("entrustIslicode" ,odgd.getEntrustIslicode()); + //委托用户名 + OrderUser orderUser = orderUserMapper.getUserOrder(odgd.getBatchcode(),odgd.getIslicode()); + String entrustUsername = orderUser!=null?orderUser.getName():"-"; + syncmap.put("entrustUsername",entrustUsername); + //add to list + syncList.add(syncmap); + } + + //list 转为json 发送到相关接口 + JSONArray wsynarr = new JSONArray(syncList); + //待同步过去的订单信息 + String forsync = wsynarr.toJSONString(); + JSONObject outSyncJson =SzwhApiUtils.synchInfo(forsync); + log.info(batchcode+"订单获取下载地址:"+outSyncJson); + //返回链接地址 + if("00000000".equals(outSyncJson.getString("resultCode"))){ + JSONArray syncArray = outSyncJson.getJSONArray("data"); + //获取解密地址 + JSONObject sjson = (JSONObject) syncArray.get(0); + //资源下载地址 + String sourceUrl= sjson.getString("source_url"); + //替换,然后提取出基本的地址信息 + String resUrl = sourceUrl.replace("{isliCode}/{contractISLICode}",""); + log.info("source base url:"+resUrl); + //遍历数据 + for(OrderGoodsDetail ogd:orderGoodsDetailList){ + //todo 检查 source_download 是否有内容 + //请求依据同步订单信息返回的地址获取解密资源地址 + JSONObject resJson = SzwhApiUtils.getDownOrdRes(resUrl,ogd.getIslicode(),ccmap.get(ogd.getId())); + log.info(ogd.getId()+"资源解密地址:"+resJson); + //更新订单商品资源详情 + JSONArray ogdJarr = resJson.getJSONArray("data"); + JSONObject togjson = (JSONObject) ogdJarr.get(0); + // source_download map + JSONObject sdown = new JSONObject(); + sdown.put("url",togjson.getString("url")); + sdown.put("status",4); + //合约关联编号,更新到订单商品详情中 + Map togmap = new HashMap(); + togmap.put("source_download",sdown.toString()); + orderGoodsDetailMapper.updateOrderGoodsDetail(togmap,ogd.getId()); + } } + + return 0; } @@ -170,13 +254,12 @@ public class PayServiceImpl implements PayService { //更新订单指定字段 orderMapper.updateOrderStatus(upmap,order.getId()); } - //订单信息发送至分发系统 - + // 处理订单其他信息 + payFinishOperate(order.getBatchcode()); //买家发票信息等 + invoiceBuyOperate(order.getBatchcode()); //卖家发票 -// $this->payFinishOperate($batchcode); -// $this->invoiceBuyOperate($batchcode); -// $this->invoiceSellerOperate($batchcode); + invoiceSellerOperate(order.getBatchcode()); } }catch (Exception ex){ @@ -184,4 +267,95 @@ public class PayServiceImpl implements PayService { } return 0; } + + /** + * 买家发票信息 + * @param bathcode + * @return + */ + @Override + public int invoiceBuyOperate(String bathcode) { + //发票存放路径 + String pdfpath= ChConstant.INVOICE; + //订单 + Order order = orderMapper.getOrderByBatchcode(bathcode); + //用户信息 + OrderUser orderUser = orderUserMapper.getUserOrder(bathcode,order.getBuyIslicode()); + //发票数据集合 + Map invoiceMap = new HashMap(); + invoiceMap.put("buyerName",orderUser.getName()); + invoiceMap.put("buyerType","01"); //购买方类型01:企业 + invoiceMap.put("buyerTaxNo",orderUser.getUscc());//税号 + //订单商品详情 + List ordglist = orderGoodsDetailMapper.getOrderGoodsDetailByBatchCode(bathcode); + //发票信息 + List taxlist = TaxUtils.TaxSpilt(ordglist,orderUser); + // + for(int i=0;i update set is_deleted=1 where batchcode=#{batchcode} + + + + update + + + ${k} = #{v} + + + where id=#{id} + \ No newline at end of file diff --git a/src/main/resources/mapper/szwh/TiketMapper.xml b/src/main/resources/mapper/szwh/TiketMapper.xml index 31f8fcb..e174add 100644 --- a/src/main/resources/mapper/szwh/TiketMapper.xml +++ b/src/main/resources/mapper/szwh/TiketMapper.xml @@ -154,21 +154,21 @@ - - insert into - - (uname,password,gender,urealname,ubirth,nickname,avatarurl,platfrom,sessionkey,openid) + + insert into + (batchcode,islicode,ticketid,ticketmoney,pdfUrl,ticketurl,ticketimage + ticket_status as ticketStatus,ticketApiMessage,tickettime) values ( - #{uname}, - #{password}, - #{gender}, - #{urealname}, - #{ubirth}, - #{nickname}, - #{avatarurl}, - #{platfrom}, - #{sessionkey}, - #{openid} + #{batchcode}, + #{islicode}, + #{ticketid}, + #{ticketmoney}, + #{pdfUrl}, + #{ticketurl}, + #{ticketimage}, + #{ticket_status}, + #{ticketApiMessage}, + #{tickettime} ) @@ -186,5 +186,4 @@ where id=#{id} - \ No newline at end of file diff --git a/src/test/java/cn/chjyj/szwh/Taxtest.java b/src/test/java/cn/chjyj/szwh/Taxtest.java new file mode 100644 index 0000000..21cb840 --- /dev/null +++ b/src/test/java/cn/chjyj/szwh/Taxtest.java @@ -0,0 +1,31 @@ +package cn.chjyj.szwh; + +import cn.chjyj.szwh.utils.SzwhApiUtils; +import cn.chjyj.szwh.utils.TaxUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.math.BigDecimal; + +@SpringBootTest +@RunWith(SpringJUnit4ClassRunner.class) +public class Taxtest { + /** + * 计算发票张数 + */ + @Test + public void tpscount(){ + BigDecimal cc = new BigDecimal("32000"); + int num = TaxUtils.countTaxPapers(cc.longValue(),1); + System.out.println(num); + } + //发票请求凭据 + @Test + public void taxrqtokenTest(){ + String token = SzwhApiUtils.taxReqToken(); + System.out.println(token); + } + +} diff --git a/src/test/java/cn/chjyj/szwh/service/PayServiceTest.java b/src/test/java/cn/chjyj/szwh/service/PayServiceTest.java index 9e520a8..18c9868 100644 --- a/src/test/java/cn/chjyj/szwh/service/PayServiceTest.java +++ b/src/test/java/cn/chjyj/szwh/service/PayServiceTest.java @@ -30,6 +30,8 @@ public class PayServiceTest { private OrderGoodsDetailMapper orderGoodsDetailMapper; @Autowired private GoodsMapper goodsMapper; + @Autowired + private PayService payService; @Test public void payComplete() { @@ -90,4 +92,18 @@ public class PayServiceTest { } + + //支付完成后的操作 + @Test + public void paop(){ + String bac ="1669354770578266"; + payService.payFinishOperate(bac); + } + + //买家发票 + @Test + public void invoicebuer(){ + String bac ="1669354770578266"; + payService.invoiceBuyOperate(bac); + } } \ No newline at end of file