From d5b1b7d2149c619404b3f02cb5af0d6d992a66ba Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期四, 09 十月 2025 16:49:16 +0800 Subject: [PATCH] 集成中台及正联功能 --- driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/CallbackUtil.java | 47 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java | 250 ++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java | 327 +++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java | 42 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderInfo.java | 19 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/AddAccountInfoRequest.java | 45 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentOrderRequest.java | 53 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/QianYunTongConfig.java | 3 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefund.java | 15 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java | 49 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/TCompany.java | 760 ++++++++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ModifyTravelItineraryRequest.java | 39 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallback.java | 27 user/guns-admin/src/main/resources/application-dev.yml | 2 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfo.java | 31 management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java | 219 ++ zuul/src/main/java/com/sinata/zuul/ZuulApplication.java | 4 zuul/src/main/resources/application-dev.yml | 2 driver/guns-admin/src/main/resources/application-dev.yml | 2 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoRequest.java | 23 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/TCompanyMapper.java | 77 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianUtil.java | 208 ++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfoRequest.java | 27 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java | 49 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java | 19 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java | 19 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java | 272 ++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreateData.java | 99 + management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeRequest.java | 31 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfoData.java | 42 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TokenRequest.java | 46 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianConfig.java | 90 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfoRequest.java | 39 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentInfoCallback.java | 35 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TravelItinerary.java | 64 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java | 11 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetTravelItineraryListRequest.java | 47 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOff1Data.java | 62 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/MessageBody.java | 23 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateOrderRequest.java | 53 user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/qianyuntong/QianYunTongConfig.java | 3 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/ZLUserInfo.java | 37 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/SMSUtil.java | 68 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java | 3 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfo.java | 31 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/TokenUtil.java | 91 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/SendSmsRequest.java | 33 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java | 830 ++++++++ driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZLHttpClientUtil.java | 129 + management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateTravelItineraryRequest.java | 43 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/EnterpriseUtil.java | 4 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallbackData.java | 45 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOffData.java | 66 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ListPage.java | 27 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/TCompanyMapper.xml | 635 ++++++ driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/RefundInfoRequest.java | 19 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfo.java | 35 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfo.java | 53 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TradeTerminalInfo.java | 27 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoDataRequest.java | 19 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginUser.java | 43 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreate.java | 19 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java | 15 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java | 42 eureka/src/main/resources/application-dev.yml | 2 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java | 78 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java | 19 67 files changed, 5,676 insertions(+), 12 deletions(-) diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/TCompanyMapper.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/TCompanyMapper.java new file mode 100644 index 0000000..a4cdcba --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/TCompanyMapper.java @@ -0,0 +1,77 @@ +package com.supersavedriving.driver.modular.system.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.baomidou.mybatisplus.plugins.Page; +import com.supersavedriving.driver.modular.system.model.TCompany; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * <p> + * 公司信息表 Mapper 接口 + * </p> + * + * @author 吕雪 + * @since 2020-06-06 + */ +public interface TCompanyMapper extends BaseMapper<TCompany> { + + /** + * 根据条件查询分公司列表 + * @return + */ + List<Map<String,Object>> getCompanyList(@Param("page") Page<Map<String, Object>> page, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("name") String name, + @Param("principalName") String principalName, + @Param("principalPhone") String principalPhone, + @Param("adminName") String adminName, + @Param("adminPhone") String adminPhone, + @Param("serviceStr") String serviceStr, + @Param("state") Integer state); + + /** + * 根据公司ID获取公司经营区域 + * @param id + * @return + */ + List<Map<String,Object>> getCompanyScopeById(@Param("id") Integer id); + + /** + * 根据条件查询加盟商列表 + * @return + */ + List<Map<String,Object>> getFranchiseeList(@Param("page") Page<Map<String, Object>> page, + @Param("beginTime") String beginTime, + @Param("endTime") String endTime, + @Param("name") String name, + @Param("account") String account, + @Param("principalName") String principalName, + @Param("principalPhone") String principalPhone, + @Param("serviceStr") String serviceStr, + @Param("state") Integer state, + @Param("roleType") Integer roleType, + @Param("nowUserId") Integer nowUserId); + + + /** + * 获取运营汇总数据 + * @param type + * @param start + * @param end + * @param companyId + * @param offset + * @param limit + * @return + */ + List<Map<String, Object>> queryOperationalData(@Param("type") Integer type, @Param("start") String start, + @Param("end") String end, @Param("companyId") Integer companyId, + @Param("offset") Integer offset, @Param("limit") Integer limit); + + + int queryOperationalDataCount(@Param("type") Integer type, @Param("start") String start, + @Param("end") String end, @Param("companyId") Integer companyId); +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/TCompanyMapper.xml b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/TCompanyMapper.xml new file mode 100644 index 0000000..fc17864 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/dao/mapping/TCompanyMapper.xml @@ -0,0 +1,635 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.supersavedriving.driver.modular.system.dao.TCompanyMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.supersavedriving.driver.modular.system.model.TCompany"> + <id column="id" property="id" /> + <result column="isSpe" property="isSpe" /> + <result column="isTaxi" property="isTaxi" /> + <result column="isCross" property="isCross" /> + <result column="isCrossLogistics" property="isCrossLogistics" /> + <result column="isSameLogistics" property="isSameLogistics" /> + <result column="isCharter" property="isCharter" /> + <result column="isSpeFixedOrProportional" property="isSpeFixedOrProportional" /> + <result column="isTaxiFixedOrProportional" property="isTaxiFixedOrProportional" /> + <result column="isCrossLogisticsFixedOrProportional" property="isCrossLogisticsFixedOrProportional" /> + <result column="isSameLogisticsFixedOrProportional" property="isSameLogisticsFixedOrProportional" /> + <result column="speMoney" property="speMoney" /> + <result column="taxiMoney" property="taxiMoney" /> + <result column="crossLogisticsMoney" property="crossLogisticsMoney" /> + <result column="sameLogisticsMoney" property="sameLogisticsMoney" /> + <result column="isNeedFerry" property="isNeedFerry" /> + <result column="name" property="name" /> + <result column="type" property="type" /> + <result column="superiorId" property="superiorId" /> + <result column="principalName" property="principalName" /> + <result column="principalPhone" property="principalPhone" /> + <result column="adminName" property="adminName" /> + <result column="adminPhone" property="adminPhone" /> + <result column="urgentPhoen" property="urgentPhoen" /> + <result column="setupTime" property="setupTime" /> + <result column="identifier" property="identifier" /> + <result column="addressCode" property="addressCode" /> + <result column="businessScope" property="businessScope" /> + <result column="contactAddress" property="contactAddress" /> + <result column="documentAddress" property="documentAddress" /> + <result column="economicType" property="economicType" /> + <result column="regCapital" property="regCapital" /> + <result column="legalName" property="legalName" /> + <result column="legalId" property="legalId" /> + <result column="legalPhone" property="legalPhone" /> + <result column="legalPhotoUrl" property="legalPhotoUrl" /> + <result column="licensingAgency" property="licensingAgency" /> + <result column="licenseTime" property="licenseTime" /> + <result column="licenseStartTime" property="licenseStartTime" /> + <result column="licenseEndTime" property="licenseEndTime" /> + <result column="licenseNumber" property="licenseNumber" /> + <result column="carNum" property="carNum" /> + <result column="driverNum" property="driverNum" /> + <result column="mac" property="mac" /> + <result column="state" property="state" /> + <result column="flag" property="flag" /> + <result column="upload" property="upload" /> + <result column="insertTime" property="insertTime" /> + <result column="detailAddress" property="detailAddress" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + id, isSpe, isTaxi, isCross, isCrossLogistics, isSameLogistics, isCharter, isSpeFixedOrProportional, isTaxiFixedOrProportional, isCrossLogisticsFixedOrProportional, isSameLogisticsFixedOrProportional, speMoney, taxiMoney, crossLogisticsMoney, sameLogisticsMoney, isNeedFerry, name, type, superiorId, principalName, principalPhone, adminName, adminPhone, urgentPhoen, setupTime, identifier, addressCode, businessScope, contactAddress, documentAddress, economicType, regCapital, legalName, legalId, legalPhone, legalPhotoUrl, licensingAgency, licenseTime, licenseStartTime, licenseEndTime, licenseNumber, carNum, driverNum, mac, state, flag, upload, insertTime, detailAddress + </sql> + + + <!--根据条件查询分公司列表--> + <select id="getCompanyList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page"> + SELECT * FROM (SELECT ui.account,IFNULL(ci.num,0) as franchiseeNum,IFNULL(ca.num,0) as carNumber,IFNULL(di.num,0) as driverNumber, + CONCAT(case when cc.isSpe = 1 then '专车,' else '' end, + case when cc.isTaxi = 1 then '出租车,' else '' end, + case when cc.isCross = 1 then '跨城出行,' else '' end, + case when cc.isCrossLogistics = 1 then '跨城小件物流,' else '' end, + case when cc.isSameLogistics = 1 then '同城小件物流,' else '' end, + case when cc.isCharter = 1 then '包车,' else '' end) as serverStr, + cc.* FROM t_company as cc + LEFT JOIN (SELECT * FROM sys_user where roleType = 2) as ui on ui.objectId = cc.id + LEFT JOIN (SELECT COUNT(id) as num,superiorId FROM t_company where type = 3 and flag != 3 GROUP BY superiorId) as ci on ci.superiorId = cc.id + LEFT JOIN (SELECT COUNT(id) as num,companyId FROM t_car where state = 1 GROUP BY companyId) as ca on ca.companyId = cc.id + LEFT JOIN (SELECT COUNT(id) as num,companyId FROM t_driver where flag != 3 GROUP BY companyId) as di on di.companyId = cc.id + ) as o + <where> + o.type = 2 and o.flag != 3 + <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''"> + AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59')) + </if> + <if test="name != null and name != ''"> + and o.name LIKE CONCAT('%',#{name},'%') + </if> + <if test="principalName != null and principalName != ''"> + and o.principalName LIKE CONCAT('%',#{principalName},'%') + </if> + <if test="principalPhone != null and principalPhone != ''"> + and o.principalPhone LIKE CONCAT('%',#{principalPhone},'%') + </if> + <if test="adminName != null and adminName != ''"> + and o.adminName LIKE CONCAT('%',#{adminName},'%') + </if> + <if test="adminPhone != null and adminPhone != ''"> + and o.adminPhone LIKE CONCAT('%',#{adminPhone},'%') + </if> + <if test="serviceStr != null and serviceStr != ''"> + and o.serverStr LIKE CONCAT('%',#{serviceStr},'%') + </if> + <if test="state != null and state != '' and state == 1"> + and o.state = 1 + </if> + <if test="state != null and state != '' and state == 2"> + and o.state = 0 + </if> + </where> + order by o.id desc + </select> + + <!--根据公司ID获取公司经营区域--> + <select id="getCompanyScopeById" resultType="map"> + SELECT CONCAT(case when r1.`name` is not null then r1.`name` else '' end, + case when r2.`name` is not null then r2.`name` else '' end, + case when r3.`name` is not null then r3.`name` else '' end) as value,cc.* FROM t_company_city as cc + LEFT JOIN t_region as r1 on r1.code = cc.provinceCode + LEFT JOIN t_region as r2 on r2.code = cc.cityCode + LEFT JOIN t_region as r3 on r3.code = cc.areaCode + where cc.companyId = #{id} and cc.state = 1 order by id asc + </select> + + <!--根据条件查询加盟商列表--> + <select id="getFranchiseeList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page"> + SELECT * FROM (SELECT ui.account,ci.`name` as companyName,IFNULL(ca.num,0) as carNumber,IFNULL(di.num,0) as driverNumber, + CONCAT(case when cc.isSpe = 1 then '专车,' else '' end, + case when cc.isTaxi = 1 then '出租车,' else '' end, + case when cc.isCross = 1 then '跨城出行,' else '' end, + case when cc.isCrossLogistics = 1 then '跨城小件物流,' else '' end, + case when cc.isSameLogistics = 1 then '同城小件物流,' else '' end, + case when cc.isCharter = 1 then '包车,' else '' end) as serverStr, + cc.* FROM t_company as cc + LEFT JOIN (SELECT * FROM sys_user where roleType = 3) as ui on ui.objectId = cc.id + LEFT JOIN (select * from t_company where type = 2 and flag != 3) as ci on ci.id = cc.superiorId + LEFT JOIN (SELECT COUNT(id) as num,franchiseeId FROM t_car where state = 1 GROUP BY franchiseeId) as ca on ca.franchiseeId = cc.id + LEFT JOIN (SELECT COUNT(id) as num,franchiseeId FROM t_driver where flag != 3 GROUP BY franchiseeId) as di on di.franchiseeId = cc.id) as o + <where> + o.type = 3 and o.flag != 3 + <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''"> + AND (o.insertTime between CONCAT(#{beginTime},' 00:00:00') and CONCAT(#{endTime},' 23:59:59')) + </if> + <if test="name != null and name != ''"> + and o.name LIKE CONCAT('%',#{name},'%') + </if> + <if test="account != null and account != ''"> + and o.account LIKE CONCAT('%',#{account},'%') + </if> + <if test="principalName != null and principalName != ''"> + and o.principalName LIKE CONCAT('%',#{principalName},'%') + </if> + <if test="principalPhone != null and principalPhone != ''"> + and o.principalPhone LIKE CONCAT('%',#{principalPhone},'%') + </if> + <if test="serviceStr != null and serviceStr != ''"> + and o.serverStr LIKE CONCAT('%',#{serviceStr},'%') + </if> + <if test="state != null and state != '' and state == 1"> + and o.state = 1 + </if> + <if test="state != null and state != '' and state == 2"> + and o.state = 0 + </if> + <if test="roleType != null and roleType != '' and roleType == 2"> + and o.superiorId = #{nowUserId} + </if> + </where> + order by o.id desc + </select> + + + <select id="queryOperationalData" resultType="map"> + + select + *, + ROUND(if(orderNum != 0, cancelNum / orderNum, 0) * 100, 2) as cancelProportion, + (onlinePay + offlinePay) as total, + ROUND((onlinePay / (onlinePay + offlinePay)) * 100, 2) as payProportion + from ( + select + aa.time, + sum(aa.register) as register, + sum(aa.`online`) as `online`, + sum(aa.orderNum) as orderNum, + sum(aa.cancelNum) as cancelNum, + sum(aa.onlinePay) as onlinePay, + sum(aa.offlinePay) as offlinePay, + sum(aa.money) as money, + sum(aa.complaint) as complaint + from ( + select DATE_FORMAT(insertTime, '%Y-%m-%d') as time, count(id) as register, 0 as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint + from t_user + where flag != 3 and state = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(insertTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(insertTime, '%Y-%m-%d') + union all + select DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time, 0, count(a.id) as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint + from t_driver_online a + left join t_driver b on (a.driverId = b.id) + where 1 = 1 + <if test="null != companyId"> + and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId}) + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(a.insertTime, '%Y-%m-%d') + union all + <if test="1 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_private_car where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="2 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_taxi where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="3 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="4 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_logistics where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_private_car where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_taxi where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_logistics where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_private_car where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_taxi where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_cross_city where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_logistics where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_private_car where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_taxi where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_cross_city where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_logistics where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + select DATE_FORMAT(a.insert_time, '%Y-%m-%d'), 0, 0, 0, 0, 0, 0, 0, count(a.id) from t_complaint a + left join t_driver b on (a.driverId = b.id) + where 1 = 1 + <if test="null != companyId"> + and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId}) + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(a.insert_time, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(a.insert_time, '%Y-%m-%d') + ) as aa group by aa.time + ) as da order by `time` desc + <if test="null != offset and null != limit"> + limit #{offset}, #{limit} + </if> + </select> + + + + <select id="queryOperationalDataCount" resultType="int"> + + select + count(`time`) + from ( + select + aa.time, + sum(aa.register) as register, + sum(aa.`online`) as `online`, + sum(aa.orderNum) as orderNum, + sum(aa.cancelNum) as cancelNum, + sum(aa.onlinePay) as onlinePay, + sum(aa.offlinePay) as offlinePay, + sum(aa.money) as money, + sum(aa.complaint) as complaint + from ( + select DATE_FORMAT(insertTime, '%Y-%m-%d') as time, count(id) as register, 0 as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint + from t_user + where flag != 3 and state = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(insertTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(insertTime, '%Y-%m-%d') + union all + select DATE_FORMAT(a.insertTime, '%Y-%m-%d') as time, 0, count(a.id) as `online`, 0 as orderNum, 0 as cancelNum, 0 as onlinePay, 0 as offlinePay, 0 as money, 0 as complaint from t_driver_online a + left join t_driver b on (a.driverId = b.id) + where 1 = 1 + <if test="null != companyId"> + and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId}) + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(a.insertTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(a.insertTime, '%Y-%m-%d') + union all + <if test="1 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_private_car where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="2 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_taxi where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="3 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="4 == type"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, count(id), 0, 0, 0, 0, 0 from t_order_logistics where isDelete = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_private_car where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_taxi where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_cross_city where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, count(id), 0, 0, 0, 0 from t_order_logistics where isDelete = 1 and state in (10, 12) + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_private_car where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_taxi where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_cross_city where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, count(id), 0, sum(payMoney), 0 from t_order_logistics where isDelete = 1 and payManner = 1 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 1"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_private_car where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 2"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_taxi where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 3"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_cross_city where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + <if test="type == 4"> + select DATE_FORMAT(travelTime, '%Y-%m-%d'), 0, 0, 0, 0, 0, count(id), 0, 0 from t_order_logistics where isDelete = 1 and payManner = 2 + <if test="null != companyId"> + and companyId = #{companyId} + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(travelTime, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(travelTime, '%Y-%m-%d') + union all + </if> + select DATE_FORMAT(a.insert_time, '%Y-%m-%d'), 0, 0, 0, 0, 0, 0, 0, count(a.id) from t_complaint a + left join t_driver b on (a.driverId = b.id) + where 1 = 1 + <if test="null != companyId"> + and if(b.franchiseeId is null or b.franchiseeId = 0, b.companyId = #{companyId}, b.franchiseeId = #{companyId}) + </if> + <if test="null != start and '' != start and null != end and '' != end"> + and DATE_FORMAT(a.insert_time, '%Y-%m-%d') between #{start} and #{end} + </if> + group by DATE_FORMAT(a.insert_time, '%Y-%m-%d') + ) as aa group by aa.time + ) as da order by `time` desc + </select> +</mapper> diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/TCompany.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/TCompany.java new file mode 100644 index 0000000..ef92a53 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/model/TCompany.java @@ -0,0 +1,760 @@ +package com.supersavedriving.driver.modular.system.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * <p> + * 公司信息表 + * </p> + * + * @author 吕雪 + * @since 2020-06-06 + */ +@TableName("t_company") +public class TCompany extends Model<TCompany> { + + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 是否经营专车(1=是,2=否) + */ + private Integer isSpe; + /** + * 是否经营出租车(1=是,2=否) + */ + private Integer isTaxi; + /** + * 是否经营跨城(1=是,2=否) + */ + private Integer isCross; + /** + * 是否经营跨城物流(1=是,2=否) + */ + private Integer isCrossLogistics; + /** + * 是否经营同城物流(1=是,2=否) + */ + private Integer isSameLogistics; + /** + * 是否经营包车(1=是,2=否) + */ + private Integer isCharter; + /** + * 专车提成方式(1=比例,2=固定) + */ + private Integer isSpeFixedOrProportional; + /** + * 出租车提成方式(1=比例,2=固定) + */ + private Integer isTaxiFixedOrProportional; + /** + * 跨城物流提成方式(1=比例,2=固定) + */ + private Integer isCrossLogisticsFixedOrProportional; + /** + * 同城物流提成方式(1=比例,2=固定) + */ + private Integer isSameLogisticsFixedOrProportional; + /** + * 专车提成数值 + */ + private BigDecimal speMoney; + /** + * 出租车提成数值 + */ + private BigDecimal taxiMoney; + /** + * 跨城物流提成数值 + */ + private BigDecimal crossLogisticsMoney; + /** + * 同城物流 + */ + private BigDecimal sameLogisticsMoney; + /** + * 是否需要摆渡车(1=是,2=否) + */ + private Integer isNeedFerry; + /** + * 企业名称 + */ + private String name; + /** + * 企业类型(1:平台,2:分公司,3:加盟商) + */ + private Integer type; + /** + * 上级企业id + */ + private Integer superiorId; + /** + * 负责人姓名 + */ + private String principalName; + /** + * 负责人电话 + */ + private String principalPhone; + /** + * 管理员姓名 + */ + private String adminName; + /** + * 管理员电话 + */ + private String adminPhone; + /** + * 紧急联系电话 + */ + private String urgentPhoen; + /** + * 服务机构设立日期 + */ + @DateTimeFormat + private Date setupTime; + /** + * 统一社会信用代码 + */ + private String identifier; + /** + * 注册地行政区划分代码 + */ + private String addressCode; + /** + * 经营范围 + */ + private String businessScope; + /** + * 通信地址 + */ + private String contactAddress; + /** + * 行政文书送达地址 + */ + private String documentAddress; + /** + * 经营业户经济类型 + */ + private String economicType; + /** + * 注册资本 + */ + private String regCapital; + /** + * 法人代表姓名 + */ + private String legalName; + /** + * 法人代表身份证号 + */ + private String legalId; + /** + * 法人代表电话 + */ + private String legalPhone; + /** + * 法人代表身份证扫描件文件地址 + */ + private String legalPhotoUrl; + /** + * 经营许可证发证机构 + */ + private String licensingAgency; + /** + * 经营许可证初次发证日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date licenseTime; + /** + * 经营许可证有效期起 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date licenseStartTime; + /** + * 经营许可证有效期止 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date licenseEndTime; + /** + * 网络预约车经营许可证号 + */ + private String licenseNumber; + /** + * 注册网络预约车辆数 + */ + private Integer carNum; + /** + * 注册网络预约车驾驶员数量 + */ + private Integer driverNum; + /** + * 登录MAC地址(多个以逗号分隔) + */ + private String mac; + /** + * 当前状态(0:正常,1:禁用) + */ + private Integer state; + /** + * 操作标识(1:新增,2:修改,3:删除) + */ + private String flag; + /** + * 上传标识(1:未上传,2:已上传) + */ + private String upload; + /** + * 创建时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date insertTime; + /** + * 具体地址 + */ + private String detailAddress; + /** + * 分公司代码 + */ + private String code; + /** + * 分公司区划代码 + */ + private String scopeCode; + /** + * 经营区域 + */ + private String serviceScope; + //身份证正面 + private String idCardPositive; + //身份证反面 + private String idCardReverse; + /** + * 中台企业编号 + */ + private String enterCode; + /** + * 中台新增标识(0=否,1=是) + */ + private Integer enterNew; + + public String getIdCardPositive() { + return idCardPositive; + } + + public void setIdCardPositive(String idCardPositive) { + this.idCardPositive = idCardPositive; + } + + public String getIdCardReverse() { + return idCardReverse; + } + + public void setIdCardReverse(String idCardReverse) { + this.idCardReverse = idCardReverse; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getScopeCode() { + return scopeCode; + } + + public void setScopeCode(String scopeCode) { + this.scopeCode = scopeCode; + } + + public String getServiceScope() { + return serviceScope; + } + + public void setServiceScope(String serviceScope) { + this.serviceScope = serviceScope; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getIsSpe() { + return isSpe; + } + + public void setIsSpe(Integer isSpe) { + this.isSpe = isSpe; + } + + public Integer getIsTaxi() { + return isTaxi; + } + + public void setIsTaxi(Integer isTaxi) { + this.isTaxi = isTaxi; + } + + public Integer getIsCross() { + return isCross; + } + + public void setIsCross(Integer isCross) { + this.isCross = isCross; + } + + public Integer getIsCrossLogistics() { + return isCrossLogistics; + } + + public void setIsCrossLogistics(Integer isCrossLogistics) { + this.isCrossLogistics = isCrossLogistics; + } + + public Integer getIsSameLogistics() { + return isSameLogistics; + } + + public void setIsSameLogistics(Integer isSameLogistics) { + this.isSameLogistics = isSameLogistics; + } + + public Integer getIsCharter() { + return isCharter; + } + + public void setIsCharter(Integer isCharter) { + this.isCharter = isCharter; + } + + public Integer getIsSpeFixedOrProportional() { + return isSpeFixedOrProportional; + } + + public void setIsSpeFixedOrProportional(Integer isSpeFixedOrProportional) { + this.isSpeFixedOrProportional = isSpeFixedOrProportional; + } + + public Integer getIsTaxiFixedOrProportional() { + return isTaxiFixedOrProportional; + } + + public void setIsTaxiFixedOrProportional(Integer isTaxiFixedOrProportional) { + this.isTaxiFixedOrProportional = isTaxiFixedOrProportional; + } + + public Integer getIsCrossLogisticsFixedOrProportional() { + return isCrossLogisticsFixedOrProportional; + } + + public void setIsCrossLogisticsFixedOrProportional(Integer isCrossLogisticsFixedOrProportional) { + this.isCrossLogisticsFixedOrProportional = isCrossLogisticsFixedOrProportional; + } + + public Integer getIsSameLogisticsFixedOrProportional() { + return isSameLogisticsFixedOrProportional; + } + + public void setIsSameLogisticsFixedOrProportional(Integer isSameLogisticsFixedOrProportional) { + this.isSameLogisticsFixedOrProportional = isSameLogisticsFixedOrProportional; + } + + public BigDecimal getSpeMoney() { + return speMoney; + } + + public void setSpeMoney(BigDecimal speMoney) { + this.speMoney = speMoney; + } + + public BigDecimal getTaxiMoney() { + return taxiMoney; + } + + public void setTaxiMoney(BigDecimal taxiMoney) { + this.taxiMoney = taxiMoney; + } + + public BigDecimal getCrossLogisticsMoney() { + return crossLogisticsMoney; + } + + public void setCrossLogisticsMoney(BigDecimal crossLogisticsMoney) { + this.crossLogisticsMoney = crossLogisticsMoney; + } + + public BigDecimal getSameLogisticsMoney() { + return sameLogisticsMoney; + } + + public void setSameLogisticsMoney(BigDecimal sameLogisticsMoney) { + this.sameLogisticsMoney = sameLogisticsMoney; + } + + public Integer getIsNeedFerry() { + return isNeedFerry; + } + + public void setIsNeedFerry(Integer isNeedFerry) { + this.isNeedFerry = isNeedFerry; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getSuperiorId() { + return superiorId; + } + + public void setSuperiorId(Integer superiorId) { + this.superiorId = superiorId; + } + + public String getPrincipalName() { + return principalName; + } + + public void setPrincipalName(String principalName) { + this.principalName = principalName; + } + + public String getPrincipalPhone() { + return principalPhone; + } + + public void setPrincipalPhone(String principalPhone) { + this.principalPhone = principalPhone; + } + + public String getAdminName() { + return adminName; + } + + public void setAdminName(String adminName) { + this.adminName = adminName; + } + + public String getAdminPhone() { + return adminPhone; + } + + public void setAdminPhone(String adminPhone) { + this.adminPhone = adminPhone; + } + + public String getUrgentPhoen() { + return urgentPhoen; + } + + public void setUrgentPhoen(String urgentPhoen) { + this.urgentPhoen = urgentPhoen; + } + + public Date getSetupTime() { + return setupTime; + } + + public void setSetupTime(Date setupTime) { + this.setupTime = setupTime; + } + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getAddressCode() { + return addressCode; + } + + public void setAddressCode(String addressCode) { + this.addressCode = addressCode; + } + + public String getBusinessScope() { + return businessScope; + } + + public void setBusinessScope(String businessScope) { + this.businessScope = businessScope; + } + + public String getContactAddress() { + return contactAddress; + } + + public void setContactAddress(String contactAddress) { + this.contactAddress = contactAddress; + } + + public String getDocumentAddress() { + return documentAddress; + } + + public void setDocumentAddress(String documentAddress) { + this.documentAddress = documentAddress; + } + + public String getEconomicType() { + return economicType; + } + + public void setEconomicType(String economicType) { + this.economicType = economicType; + } + + public String getRegCapital() { + return regCapital; + } + + public void setRegCapital(String regCapital) { + this.regCapital = regCapital; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public String getLegalId() { + return legalId; + } + + public void setLegalId(String legalId) { + this.legalId = legalId; + } + + public String getLegalPhone() { + return legalPhone; + } + + public void setLegalPhone(String legalPhone) { + this.legalPhone = legalPhone; + } + + public String getLegalPhotoUrl() { + return legalPhotoUrl; + } + + public void setLegalPhotoUrl(String legalPhotoUrl) { + this.legalPhotoUrl = legalPhotoUrl; + } + + public String getLicensingAgency() { + return licensingAgency; + } + + public void setLicensingAgency(String licensingAgency) { + this.licensingAgency = licensingAgency; + } + + public Date getLicenseTime() { + return licenseTime; + } + + public void setLicenseTime(Date licenseTime) { + this.licenseTime = licenseTime; + } + + public Date getLicenseStartTime() { + return licenseStartTime; + } + + public void setLicenseStartTime(Date licenseStartTime) { + this.licenseStartTime = licenseStartTime; + } + + public Date getLicenseEndTime() { + return licenseEndTime; + } + + public void setLicenseEndTime(Date licenseEndTime) { + this.licenseEndTime = licenseEndTime; + } + + public String getLicenseNumber() { + return licenseNumber; + } + + public void setLicenseNumber(String licenseNumber) { + this.licenseNumber = licenseNumber; + } + + public Integer getCarNum() { + return carNum; + } + + public void setCarNum(Integer carNum) { + this.carNum = carNum; + } + + public Integer getDriverNum() { + return driverNum; + } + + public void setDriverNum(Integer driverNum) { + this.driverNum = driverNum; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getFlag() { + return flag; + } + + public void setFlag(String flag) { + this.flag = flag; + } + + public String getUpload() { + return upload; + } + + public void setUpload(String upload) { + this.upload = upload; + } + + public Date getInsertTime() { + return insertTime; + } + + public void setInsertTime(Date insertTime) { + this.insertTime = insertTime; + } + + public String getDetailAddress() { + return detailAddress; + } + + public void setDetailAddress(String detailAddress) { + this.detailAddress = detailAddress; + } + + public String getEnterCode() { + return enterCode; + } + + public void setEnterCode(String enterCode) { + this.enterCode = enterCode; + } + + public Integer getEnterNew() { + return enterNew; + } + + public void setEnterNew(Integer enterNew) { + this.enterNew = enterNew; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + + @Override + public String toString() { + return "TCompany{" + + "id=" + id + + ", isSpe=" + isSpe + + ", isTaxi=" + isTaxi + + ", isCross=" + isCross + + ", isCrossLogistics=" + isCrossLogistics + + ", isSameLogistics=" + isSameLogistics + + ", isCharter=" + isCharter + + ", isSpeFixedOrProportional=" + isSpeFixedOrProportional + + ", isTaxiFixedOrProportional=" + isTaxiFixedOrProportional + + ", isCrossLogisticsFixedOrProportional=" + isCrossLogisticsFixedOrProportional + + ", isSameLogisticsFixedOrProportional=" + isSameLogisticsFixedOrProportional + + ", speMoney=" + speMoney + + ", taxiMoney=" + taxiMoney + + ", crossLogisticsMoney=" + crossLogisticsMoney + + ", sameLogisticsMoney=" + sameLogisticsMoney + + ", isNeedFerry=" + isNeedFerry + + ", name=" + name + + ", type=" + type + + ", superiorId=" + superiorId + + ", principalName=" + principalName + + ", principalPhone=" + principalPhone + + ", adminName=" + adminName + + ", adminPhone=" + adminPhone + + ", urgentPhoen=" + urgentPhoen + + ", setupTime=" + setupTime + + ", identifier=" + identifier + + ", addressCode=" + addressCode + + ", businessScope=" + businessScope + + ", contactAddress=" + contactAddress + + ", documentAddress=" + documentAddress + + ", economicType=" + economicType + + ", regCapital=" + regCapital + + ", legalName=" + legalName + + ", legalId=" + legalId + + ", legalPhone=" + legalPhone + + ", legalPhotoUrl=" + legalPhotoUrl + + ", licensingAgency=" + licensingAgency + + ", licenseTime=" + licenseTime + + ", licenseStartTime=" + licenseStartTime + + ", licenseEndTime=" + licenseEndTime + + ", licenseNumber=" + licenseNumber + + ", carNum=" + carNum + + ", driverNum=" + driverNum + + ", mac=" + mac + + ", state=" + state + + ", flag=" + flag + + ", upload=" + upload + + ", insertTime=" + insertTime + + ", detailAddress=" + detailAddress + + "}"; + } +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/EnterpriseUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/EnterpriseUtil.java index 8510099..dfa1152 100644 --- a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/EnterpriseUtil.java +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/EnterpriseUtil.java @@ -6,9 +6,7 @@ import com.open.common.util.OpenApiClient; import com.open.common.util.SystemParameterNames; import com.supersavedriving.driver.modular.system.util.SpringContextsUtil; -import com.supersavedriving.driver.modular.system.util.qianyuntong.model.CheckEnterExist; -import com.supersavedriving.driver.modular.system.util.qianyuntong.model.EnterpriseInfo; -import com.supersavedriving.driver.modular.system.util.qianyuntong.model.ModifyEnterpriseInfoRequest; +import com.supersavedriving.driver.modular.system.util.qianyuntong.model.*; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/QianYunTongConfig.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/QianYunTongConfig.java index 2523950..7d9d254 100644 --- a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/QianYunTongConfig.java +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/QianYunTongConfig.java @@ -71,7 +71,8 @@ public QianYunTongConfig getQianYunTongConfig() { if("dev".equals(activeProfile)){ this.appkey = "10001104"; - this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; +// this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; + this.privateKeyPath = "C:\\Users\\Admin\\Desktop\\private_key_test.pem"; this.userName = "xiaofei"; this.status = "1"; this.setApiUrl("https://test-zhongtai.stqcloud.com:10070"); diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/AddAccountInfoRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/AddAccountInfoRequest.java new file mode 100644 index 0000000..4d95884 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/AddAccountInfoRequest.java @@ -0,0 +1,45 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 18:45 + */ +@Data +public class AddAccountInfoRequest { + /** + * 易信编号 + * (个人帐号传onconuuid, + * 企业帐号传企业编号) + */ + private String custId; + /** + * 帐号编号 + */ + private String accountNo; + /** + * 帐户名称 + */ + private String accountName; + /** + * 租户标识: 黔南-522700 + */ + private String partnerId; + /** + * 场景编号:网约车-100 + */ + private String industryCode; + /** + * 支付方式: 501101 + */ + private String payModeId; + /** + * 支付模式: APP + */ + private String accessMode; + /** + * 司机手机号 + */ + private String mobile; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java new file mode 100644 index 0000000..fe260d4 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java @@ -0,0 +1,49 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OrderRefundNoticeRequest { + /** + * 场景标识 + */ + private String scene; + /** + * 订单中心订单号 + */ + private String orderId; + /** + * 场景应用标识。默认52270015 + */ + private String mhltiCenterAppId; + /** + * 退款工单标识 + */ + private String refundPayNum; + /** + * 退款类型 1:未发货退款 2:未破损拒收 3:破损拒收 4:部分退款 5:全部退款 + */ + private String refundType; + /** + * 申请退款金额 + */ + private BigDecimal applyRefundCharge; + /** + * 实际退款金额 + */ + private BigDecimal actualRefundCharge; + /** + * 退款人 + */ + private String refundPerson; + /** + * 退款账号 + */ + private String refundAccount; + /** + * 退款理由 + */ + private String remark; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/RefundInfoRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/RefundInfoRequest.java new file mode 100644 index 0000000..a51356e --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/RefundInfoRequest.java @@ -0,0 +1,19 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class RefundInfoRequest { + /** + * 支付交易明细标识 + */ + private String payItemId; + /** + * 支付工单标识 + */ + private String payId; + /** + * 交易金额,单位分 + */ + private String tradeFee; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java new file mode 100644 index 0000000..b91e2e9 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java @@ -0,0 +1,19 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class TradeOrderCancelRequest { + /** + * 场景标识 + */ + private String scene; + /** + * 订单中心订单号 + */ + private String orderId; + /** + * 场景应用标识。默认52270015 + */ + private String mhltiCenterAppId; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefund.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefund.java new file mode 100644 index 0000000..aedd00c --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefund.java @@ -0,0 +1,15 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class TradeOrderRefund { + /** + * 退款总金额 + */ + private String refundTotalFee; + /** + * 退款标识 + */ + private String refundId; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java new file mode 100644 index 0000000..74192a3 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java @@ -0,0 +1,42 @@ +package com.supersavedriving.driver.modular.system.util.qianyuntong.model; + + +import lombok.Data; + +import java.util.List; + +@Data +public class TradeOrderRefundRequest { + /** + * 商户号,由支付中心分配。测试环境5400004,生产环境:5401007 + */ + private String payPartnerId; + /** + * 订单中心订单号 + */ + private String partnerPayId; + /** + * 支付工单标识 + */ + private String payId; + /** + * 退款总金额,单位为分 + * 同一退款单多次发起退款请求时,退款金额必须一致 + */ + private String refundTotalFee; + /** + * 退款原因 + */ + private String remark; + /** + * 退款类型: + * RF 退款 + * BR 部分退款(目前仅集团统一支付支持部分退款) + * CZ 冲正 + */ + private String refundType; + /** + * 支付退款单明细集合 + */ + private List<RefundInfoRequest> refundInfos; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/CallbackUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/CallbackUtil.java new file mode 100644 index 0000000..82e3ac5 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/CallbackUtil.java @@ -0,0 +1,47 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian; + +import com.supersavedriving.driver.modular.system.util.SpringContextsUtil; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.MessageBody; +import com.zlpay.assist.encrypt.sm4.SM4Util; +import com.zlpay.assist.sign.sm2.SM2Util; +import lombok.extern.slf4j.Slf4j; + +/** + * @author zhibing.pu + * @Date 2025/7/28 14:25 + */ +@Slf4j +public class CallbackUtil { + + private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig(); + + + public static String callback(MessageBody messageBody) { + try { + String data = messageBody.getData(); + String sign = messageBody.getSign(); + String secret = messageBody.getSecret(); + //加密对称加密的秘钥 + // 获取公钥 + String publicKey = ZhengLianUtil.getPublicKey(); + // 验签 + boolean checkResult = SM2Util.verify(publicKey, zhengLianConfig.getEncrpNo(), sign, data); + System.out.println("验签结果:" + checkResult); + // 获取私钥 + String privateKey = ZhengLianUtil.getPrivateKey(); + // 解密对称秘钥 + String k = SM2Util.decrypt(privateKey, secret); + System.out.println("对称秘钥:" + k); + // 解密业务报文 + String backData = SM4Util.sm4EcbDecrypt(k, data); + System.out.println("业务报文:" + backData); + return backData; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/TokenUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/TokenUtil.java new file mode 100644 index 0000000..35fda84 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/TokenUtil.java @@ -0,0 +1,91 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.supersavedriving.driver.modular.system.util.SpringContextsUtil; +import com.supersavedriving.driver.modular.system.util.UUIDUtil; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.MessageBody; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.TokenRequest; +import com.zlpay.assist.encrypt.sm4.SM4Util; +import com.zlpay.assist.sign.sm2.SM2Util; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2025/7/24 14:06 + */ +@Slf4j +public class TokenUtil { + + private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig(); + + + public static String getToken(TokenRequest tokenRequest) throws Exception { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + Map<String,String> headerMap = new HashMap<String,String>(); + MessageBody body = new MessageBody(); + headerMap.put("msgId", UUIDUtil.getRandomCode()); + headerMap.put("merchNo", zhengLianConfig.getMerchNo()); + headerMap.put("txCode", "ZLPAY.ACC.T0001"); + headerMap.put("version", "1.0.1"); + headerMap.put("signa", "1"); + headerMap.put("signNo", zhengLianConfig.getSignNo()); + headerMap.put("encrp", "1"); + headerMap.put("encrpNo", zhengLianConfig.getEncrpNo()); + headerMap.put("timestamp", sdf.format(new Date())); + log.info("【证联获取token】请求头报文:"+JSON.toJSONString(headerMap)); + + tokenRequest.setAppId(zhengLianConfig.getAppid()); + String reqBO = JSON.toJSONString(tokenRequest); + log.info("【证联获取token】请求体报文:"+reqBO); + // 生成对称加密秘钥 + String key = ZhengLianUtil.generateKey(16); + // 加密数据 + String jsonData = SM4Util.sm4EcbEncrypt(key, reqBO, "NoPadding"); + //加密对称加密的秘钥 + // 获取公钥 + String publicKey = ZhengLianUtil.getPublicKey(); + String secrtKey = SM2Util.encrypt(publicKey, key); + + // 将密文放入body + body.setData(jsonData); + body.setSign(ZhengLianUtil.sign(jsonData)); + body.setSecret(secrtKey); + log.info("【证联获取token】请求体密文报文:"+JSON.toJSONString(body)); + String result = ZLHttpClientUtil.doPost(zhengLianConfig.getUrl(), headerMap, JSON.toJSONString(body)); + + log.info("【证联获取token】应答内容:"+ result); + MessageBody respBody = JSON.parseObject(result,MessageBody.class); + // 验签 + boolean checkResult = SM2Util.verify(publicKey, zhengLianConfig.getEncrpNo(), respBody.getSign(), respBody.getData()); + log.info("【证联获取token】验签结果:" + checkResult); + // 获取私钥 + String privateKey = ZhengLianUtil.getPrivateKey(); + // 解密对称秘钥 + String k = SM2Util.decrypt(privateKey, respBody.getSecret()); + log.info("【证联获取token】对称秘钥:" + k); + // 解密业务报文 + String backData = SM4Util.sm4EcbDecrypt(k, respBody.getData()); + log.info("【证联获取token】返回业务报文:" + backData); + JSONObject jsonObject = JSON.parseObject(backData); + String sysRtnCode = jsonObject.getString("sysRtnCode"); + if(!"000000".equals(sysRtnCode)){ + log.error("【证联获取token】获取token失败!{}", jsonObject.getString("sysRtnMsg")); + throw new Exception(jsonObject.getString("sysRtnMsg")); + } + JSONObject bizData = jsonObject.getJSONObject("bizData"); + String resCode = bizData.getString("resCode"); + if(!"S010000".equals(resCode)){ + log.error("【证联获取token】获取token失败!{}", bizData.getString("resMsg")); + throw new Exception(jsonObject.getString("resMsg")); + } + JSONObject resData = bizData.getJSONObject("resData"); + return resData.getString("token"); + } + +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZLHttpClientUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZLHttpClientUtil.java new file mode 100644 index 0000000..86258f7 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZLHttpClientUtil.java @@ -0,0 +1,129 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian; + +import org.apache.http.client.config.AuthSchemes; +import org.apache.http.client.config.CookieSpecs; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.IOException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.Arrays; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +/** + * @author zhibing.pu + * @Date 2025/7/28 14:23 + */ +public class ZLHttpClientUtil { + + /** + * 连接超时时间 + */ + private final static int CONNECT_TIMEOUT = 30000; + /** + * 请求超时时间 + */ + private final static int REQUEST_TIMEOUT = 50000; + /** + * socket超时时间 + */ + private final static int SOCKET_TIMEOUT = 50000; + /** + * 请求格式 + */ + private final static String FORMAT = "application/json"; + /** + * 请求类型 + */ + private final static String POST_TYPE = "https://"; + + public static String doPost(String url, Map<String, String> headerMap, String jsonData) { + CloseableHttpClient httpClient = HttpClients.createDefault(); + if (url != null && url.startsWith(POST_TYPE)) { + httpClient = sslClient(); + } + HttpPost httpPost = new HttpPost(url); + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT) + .setConnectionRequestTimeout(REQUEST_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).setRedirectsEnabled(true) + .build(); + httpPost.setConfig(requestConfig); + httpPost.setHeader("Content-Type", "application/json"); + if (headerMap != null) { + Set<String> keys = headerMap.keySet(); + for (Iterator<String> i = keys.iterator(); i.hasNext();) { + String key = (String) i.next(); + httpPost.addHeader(key, headerMap.get(key)); + } + } + try { + httpPost.setEntity(new StringEntity(jsonData, ContentType.create(FORMAT, "UTF-8"))); + CloseableHttpResponse execute = httpClient.execute(httpPost); + int statusCode = execute.getStatusLine().getStatusCode(); + if (statusCode == 200) { + return String.valueOf(EntityUtils.toString(execute.getEntity())); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != httpClient) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + private static CloseableHttpClient sslClient() { + try { + X509TrustManager trustManager = new X509TrustManager() { + @Override public X509Certificate[] getAcceptedIssuers() { + return null; + } + @Override public void checkClientTrusted(X509Certificate[] xcs, String str) {} + @Override public void checkServerTrusted(X509Certificate[] xcs, String str) {} + }; + SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS); + ctx.init(null, new TrustManager[] { trustManager }, null); + SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE); + // 创建Registry + RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT) + .setExpectContinueEnabled(Boolean.TRUE).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM,AuthSchemes.DIGEST)) + .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build(); + Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https",socketFactory).build(); + // 创建ConnectionManager,添加Connection配置信息 + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager) + .setDefaultRequestConfig(requestConfig).build(); + return closeableHttpClient; + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianConfig.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianConfig.java new file mode 100644 index 0000000..14e16e4 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianConfig.java @@ -0,0 +1,90 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @author zhibing.pu + * @Date 2025/7/8 11:31 + */ +@Data +@Component +public class ZhengLianConfig { + + @Value("${spring.profiles.active}") + private String activeProfile; + /** + * 接口地址 + */ + private String url; + /** + * appid + */ + private String appid; + /** + * 商户号 + */ + private String merchNo; + /** + * 加密证书序列号 + */ + private String encrpNo; + /** + * 签名证书序列号 + */ + private String signNo; + /** + * 证书 + */ + private String cer; + /** + * 证书 + */ + private String sm2; + /** + * + */ + private String password; + + /** + * 获取不同环境的配置 + * @return + */ + public ZhengLianConfig getZhengLianConfig() { + if("dev".equals(activeProfile)){ + this.url = "https://gatewaytest.zqpay.com"; + this.appid = "F9BFEEA567196A92E053376010ACF004"; + this.merchNo = "B00000871"; + this.encrpNo = "1055490595"; + this.signNo = "1066348524"; +// this.cer = "C:\\Users\\39373\\Desktop\\黔云通\\UAT-demo-公用\\1055490595.cer"; +// this.sm2 = "C:\\Users\\39373\\Desktop\\黔云通\\UAT-demo-公用\\871_111111.sm2"; + this.cer = "C:\\Users\\Admin\\Desktop\\1055490595.cer"; + this.sm2 = "C:\\Users\\Admin\\Desktop\\871_111111.sm2"; + this.password = "111111"; + } + if("test".equals(activeProfile)){ + this.url = "https://gatewaytest.zqpay.com"; + this.appid = "F9BFEEA567196A92E053376010ACF004"; + this.merchNo = "B00000871"; + this.encrpNo = "1055490595"; + this.signNo = "1066348524"; + this.cer = "/etraffic/server/1055490595.cer"; + this.sm2 = "/etraffic/server/871_111111.sm2"; + this.password = "111111"; + } + if("prod".equals(activeProfile)){ + this.url = "https://gateway.zqpay.com"; + this.appid = "3e06da1751ec1626b30f7703a088f298"; + this.merchNo = "B00000402"; + this.encrpNo = "1342935640"; + this.signNo = "1471742568"; + this.cer = "/etraffic/server/1342935640.cer"; + this.sm2 = "/etraffic/server/1342935640.sm2"; + this.password = "31028Mky"; + } + return this; + } + +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianUtil.java new file mode 100644 index 0000000..dd3319f --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/ZhengLianUtil.java @@ -0,0 +1,208 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.supersavedriving.driver.modular.system.util.SpringContextsUtil; +import com.supersavedriving.driver.modular.system.util.UUIDUtil; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.MessageBody; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.TradeTerminalInfo; +import com.supersavedriving.driver.modular.system.util.zhenglian.model.ZLUserInfo; +import com.zlpay.assist.encrypt.sm4.SM4Util; +import com.zlpay.assist.sign.sm2.SM2Cert; +import com.zlpay.assist.sign.sm2.SM2Util; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.RandomStringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2025/7/28 14:22 + */ +@Slf4j +public class ZhengLianUtil { + + private static ZhengLianConfig zhengLianConfig = SpringContextsUtil.getBean(ZhengLianConfig.class).getZhengLianConfig(); + + + + + + /** + * 获取用户详情 + * @param appUserId + * @param tradeTerminalInfo + * @return + * @throws Exception + */ + public static ZLUserInfo getUserInfo(String appUserId, TradeTerminalInfo tradeTerminalInfo) throws Exception { + log.info("正联配置信息:{}", JSON.toJSONString(zhengLianConfig)); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + Map<String,String> headerMap = new HashMap<String,String>(); + MessageBody body = new MessageBody(); + headerMap.put("msgId", UUIDUtil.getRandomCode()); + headerMap.put("merchNo", zhengLianConfig.getMerchNo()); + headerMap.put("txCode", "ZLPAY.ACC.T0009"); + headerMap.put("version", "1.0.1"); + headerMap.put("signa", "1"); + headerMap.put("signNo", zhengLianConfig.getSignNo()); + headerMap.put("encrp", "1"); + headerMap.put("encrpNo", zhengLianConfig.getEncrpNo()); + headerMap.put("timestamp", sdf.format(new Date())); + log.info("【证联获取用户信息】请求头报文:"+JSON.toJSONString(headerMap)); + + Map<String, Object> map = new HashMap<>(); + map.put("appId", zhengLianConfig.getAppid()); + map.put("appUserId", appUserId); + map.put("tradeTerminalInfo", tradeTerminalInfo); + String reqBO = JSON.toJSONString(map); + log.info("【证联获取用户信息】请求体报文:"+reqBO); + // 生成对称加密秘钥 + String key = ZhengLianUtil.generateKey(16); + // 加密数据 + String jsonData = SM4Util.sm4EcbEncrypt(key, reqBO, "NoPadding"); + //加密对称加密的秘钥 + // 获取公钥 + String publicKey = ZhengLianUtil.getPublicKey(); + String secrtKey = SM2Util.encrypt(publicKey, key); + + // 将密文放入body + body.setData(jsonData); + body.setSign(ZhengLianUtil.sign(jsonData)); + body.setSecret(secrtKey); + log.info("【证联获取用户信息】请求体密文报文:"+JSON.toJSONString(body)); + String result = ZLHttpClientUtil.doPost(zhengLianConfig.getUrl(), headerMap, JSON.toJSONString(body)); + + log.info("【证联获取用户信息】应答内容:"+ result); + MessageBody respBody = JSON.parseObject(result,MessageBody.class); + // 验签 + boolean checkResult = SM2Util.verify(publicKey, zhengLianConfig.getEncrpNo(), respBody.getSign(), respBody.getData()); + log.info("【证联获取用户信息】验签结果:" + checkResult); + // 获取私钥 + String privateKey = ZhengLianUtil.getPrivateKey(); + // 解密对称秘钥 + String k = SM2Util.decrypt(privateKey, respBody.getSecret()); + log.info("【证联获取用户信息】对称秘钥:" + k); + // 解密业务报文 + String backData = SM4Util.sm4EcbDecrypt(k, respBody.getData()); + log.info("【证联获取用户信息】返回业务报文:" + backData); + JSONObject jsonObject = JSON.parseObject(backData); + String sysRtnCode = jsonObject.getString("sysRtnCode"); + if(!"000000".equals(sysRtnCode)){ + log.error("【证联获取用户信息】查询用户信息失败!{}", jsonObject.getString("sysRtnMsg")); + throw new Exception(jsonObject.getString("sysRtnMsg")); + } + JSONObject bizData = jsonObject.getJSONObject("bizData"); + String resCode = bizData.getString("resCode"); + if("F010900".equals(resCode)){ + return null; + } + if(!"S010000".equals(resCode)){ + log.error("【证联获取用户信息】查询用户信息失败!{}", bizData.getString("resMsg")); + throw new Exception(jsonObject.getString("resMsg")); + } + JSONObject resData = bizData.getJSONObject("resData"); + ZLUserInfo zlUserInfo = resData.toJavaObject(ZLUserInfo.class); + return zlUserInfo; + } + + + + + + + + /** + * @Description: 从公钥证书获取公钥串 + * @return + * @return String + * @throws + * @author: tsl + * @date: 2019年4月19日 下午9:07:56 + */ + public static String getPublicKey() { + String publicKey = ""; + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(new File(zhengLianConfig.getCer())); + X509Certificate publicCert = SM2Cert.getPublicCert(inputStream); + publicKey = Base64.getEncoder().encodeToString(publicCert.getEncoded()); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return publicKey; + } + + /** + * @Description: 从私钥证书获取私钥传 + * @return + * @return String + * @throws + * @author: tsl + * @date: 2019年4月19日 下午9:08:00 + */ + public static String getPrivateKey() { + String privateKey = ""; + FileInputStream inputStream = null; + try { + inputStream = new FileInputStream(new File(zhengLianConfig.getSm2())); + byte[] priBytes = SM2Cert.getPrivateCert(inputStream); + privateKey = SM2Cert.getPrivateKey(zhengLianConfig.getPassword(), priBytes); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return privateKey; + } + /** + * @Description: 生成对称加密秘钥 + * @return String + * @throws + * @author: syuf + * @date: 2018年11月8日 下午5:50:05 + */ + public static String generateKey(int length) { + return RandomStringUtils.randomAlphanumeric(length); + } + /** + * @Description: 签名 + * @param data + * @return String + * @throws + * @author: syuf + * @date: 2018年11月15日 下午2:19:01 + */ + public static String sign(String data) { + try { + // 获取私钥 + String privateKey = getPrivateKey(); + return com.zlpay.assist.sign.sm2.SM2Util.sign(privateKey, zhengLianConfig.getSignNo(), data); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/MessageBody.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/MessageBody.java new file mode 100644 index 0000000..2ccb655 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/MessageBody.java @@ -0,0 +1,23 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/28 14:19 + */ +@Data +public class MessageBody { + /** + * 业务数据 + */ + private String data; + /** + * 签名 + */ + private String sign; + /** + * 秘钥 + */ + private String secret; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java new file mode 100644 index 0000000..f775e32 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/OpenAccountCallbackRequest.java @@ -0,0 +1,11 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/28 14:18 + */ +@Data +public class OpenAccountCallbackRequest { +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TokenRequest.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TokenRequest.java new file mode 100644 index 0000000..9bf5f1e --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TokenRequest.java @@ -0,0 +1,46 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 15:06 + */ +@Data +public class TokenRequest { + /** + * 应用appid + */ + private String appId; + /** + * APP 端用户唯一标识 + */ + private String appUserId; + /** + * 姓名 + */ + private String userName; + /** + * 证件号码 + */ + private String certNo; + /** + * 手机号码 + */ + private String phone; + /** + * 访问类型 + * 01 证联收银台支付 + * 04 HOME 页 + * 06 申请免密签约 + * 07 商户收银台支付 + * 08 开户(绑卡) + * 09 开通支付账户 + * 10 打开付款码 + */ + private String type; + /** + * 终端信息域 + */ + private TradeTerminalInfo tradeTerminalInfo; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TradeTerminalInfo.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TradeTerminalInfo.java new file mode 100644 index 0000000..df084f7 --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/TradeTerminalInfo.java @@ -0,0 +1,27 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 15:10 + */ +@Data +public class TradeTerminalInfo { + /** + * 用于标识交易设 备 公 网 IP地 址 + */ + private String ip; + /** + * 终端类型: + * 0:web + * 1:ANDROID + * 2:IOS + * 3:其它 + */ + private String terminal; + /** + * 用于标识交易设备 MAC 地址 + */ + private String mac; +} diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/ZLUserInfo.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/ZLUserInfo.java new file mode 100644 index 0000000..de607ad --- /dev/null +++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/zhenglian/model/ZLUserInfo.java @@ -0,0 +1,37 @@ +package com.supersavedriving.driver.modular.system.util.zhenglian.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/8/5 10:10 + */ +@Data +public class ZLUserInfo { + /** + * appid + */ + private String appId; + /** + * APP端用户唯一标识 + */ + private String appUserId; + /** + * 姓名 + */ + private String userName; + /** + * 证件号码 + */ + private String certNo; + /** + * 证联客户号 + */ + private String custId; + /** + * 是否已开通支付账户 + * 1:是 + * 0:否 + */ + private Integer accOpenFlag; +} diff --git a/driver/guns-admin/src/main/resources/application-dev.yml b/driver/guns-admin/src/main/resources/application-dev.yml index 6352954..63de1e3 100644 --- a/driver/guns-admin/src/main/resources/application-dev.yml +++ b/driver/guns-admin/src/main/resources/application-dev.yml @@ -42,7 +42,7 @@ eureka: client: service-url: #注册中心地址 - defaultZone: http://sinata:sinata@127.0.0.1:7000/eureka #启用身份验证的方式连接 + defaultZone: http://sinata:sinata@127.0.0.1:8001/eureka #启用身份验证的方式连接 register-with-eureka: true #在注册中心进行注册 fetch-registry: true #从Eureka中获取注册信息。 diff --git a/eureka/src/main/resources/application-dev.yml b/eureka/src/main/resources/application-dev.yml index 7c64110..95a8cf2 100644 --- a/eureka/src/main/resources/application-dev.yml +++ b/eureka/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 7000 #服务端口号 + port: 8001 #服务端口号 spring: profiles: diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java new file mode 100644 index 0000000..eb41fc2 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/core/beetl/ShiroExtUtil.java @@ -0,0 +1,219 @@ +/** + * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com). + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.stylefeng.guns.core.beetl; + +import com.alibaba.fastjson.JSON; +import com.stylefeng.guns.core.common.exception.BizExceptionEnum; +import com.stylefeng.guns.core.exception.GunsException; +import com.stylefeng.guns.core.shiro.ShiroUser; +import com.stylefeng.guns.modular.system.warpper.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.io.UnsupportedEncodingException; +import java.util.List; + +@Slf4j +@Component +public class ShiroExtUtil { + private final String NAMES_DELIMETER = ","; + + @Resource + private RedisTemplate<String, String> redisTemplate; + + /** + * 验证当前用户是否属于以下任意一个角色。 + * + * @param roleNames 角色列表 + * @return 属于:true,否则false + */ + public boolean hasAnyRoles(String roleNames) { + boolean hasAnyRole = false; + ShiroUser user = getUser(); + if (user != null && roleNames != null && roleNames.length() > 0) { + List<Integer> roleList = user.getRoleList(); + for (String role : roleNames.split(NAMES_DELIMETER)) { + if (roleList.contains(role.trim())) { + hasAnyRole = true; + break; + } + } + } + return hasAnyRole; + } + + /** + * 获取封装的 ShiroUser + * + * @return ShiroUser + */ + public ShiroUser getUser() { + ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attrs != null) { + HttpServletRequest request = attrs.getRequest(); + HttpSession session = request.getSession(); + String onconParam = edu.yale.its.tp.cas.client.Util.getOnconParam(session); + try { + onconParam = new String(Base64.decodeBase64(onconParam), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + LoginUser loginUser = JSON.parseObject(onconParam, LoginUser.class); + log.debug("当前登录用户:" + JSON.toJSONString(loginUser)); + String shiroUser = redisTemplate.opsForValue().get(loginUser.getOnconUUID()); + log.debug("当前登录用户缓存数据:" + shiroUser); + return JSON.parseObject(shiroUser, ShiroUser.class); + } + throw new GunsException(BizExceptionEnum.TOKEN_ERROR); + } + + /** + * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 + * + * @param roleName 角色名 + * @return 不属于该角色:true,否则false + */ + public boolean lacksRole(String roleName) { + return !hasRole(roleName); + } + + /** + * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 + * + * @param roleName 角色名 + * @return 属于该角色:true,否则false + */ + public boolean hasRole(String roleName) { + return getSubject() != null && roleName != null + && roleName.length() > 0 && getSubject().hasRole(roleName); + } + + /** + * 获取当前 Subject + * + * @return Subject + */ + protected Subject getSubject() { + return SecurityUtils.getSubject(); + } + + /** + * 验证当前用户是否属于以下所有角色。 + * + * @param roleNames 角色列表 + * @return 属于:true,否则false + */ + public boolean hasAllRoles(String roleNames) { + boolean hasAllRole = true; + Subject subject = getSubject(); + if (subject != null && roleNames != null && roleNames.length() > 0) { + for (String role : roleNames.split(NAMES_DELIMETER)) { + if (!subject.hasRole(role.trim())) { + hasAllRole = false; + break; + } + } + } + return hasAllRole; + } + + /** + * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public boolean hasPermission(String permission) { + ShiroUser user = getUser(); + if (null == user) { + return false; + } + if (user.isAdmin()) { + return true; + } + return user.getMenuIds().contains(permission); + } + + /** + * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public boolean lacksPermission(String permission) { + return !hasPermission(permission); + } + + /** + * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 + * + * @return 通过身份验证:true,否则false + */ + public boolean authenticated() { + return getSubject() != null && getSubject().isAuthenticated(); + } + + /** + * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 + * + * @return 没有通过身份验证:true,否则false + */ + public boolean notAuthenticated() { + return !authenticated(); + } + + /** + * 认证通过或已记住的用户。与guset搭配使用。 + * + * @return 用户:true,否则 false + */ + public boolean isUser() { + return getSubject() != null && getSubject().getPrincipal() != null; + } + + /** + * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 + * + * @return 访客:true,否则false + */ + public boolean isGuest() { + return !isUser(); + } + + /** + * 输出当前用户信息,通常为登录帐号信息。 + * + * @return 当前用户信息 + */ + public String principal() { + if (getSubject() != null) { + Object principal = getSubject().getPrincipal(); + return principal.toString(); + } + return ""; + } + + +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java new file mode 100644 index 0000000..0f9b2be --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/UUIDUtil.java @@ -0,0 +1,78 @@ +package com.stylefeng.guns.modular.system.util; + + + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.UUID; + +/** + * 定义生成随机码的工具类 + */ +public class UUIDUtil { + + private int i = 1; + + + /** + * 定义生成原生的UUID随机码 + * @return + */ + public static String getNativeUUID(){ + return UUID.randomUUID().toString(); + } + + + /** + * 生成32位随机码 + * @return + */ + public static String getRandomCode(){ + return UUIDUtil.getNativeUUID().replaceAll("-", ""); + } + + + /** + * 获取给定长度的随机码 + * @param num + * @return + * @throws Exception + */ + public static String getRandomCode(Integer num) throws Exception{ + String str = null; + if(0 < num){ + if(num % 32 > 0){ + Integer s = num / 32; + Integer l = num % 32; + StringBuffer sb = new StringBuffer(); + for(int i = 0; i < s; i++){ + sb.append(UUIDUtil.getRandomCode()); + } + sb.append(UUIDUtil.getRandomCode().substring(0, l)); + str = sb.toString(); + }else if(num % 32 == 0){ + Integer s = num / 32; + StringBuffer sb = new StringBuffer(); + for(int i = 0; i < s; i++){ + sb.append(UUIDUtil.getRandomCode()); + } + str = sb.toString(); + }else{ + str = UUIDUtil.getRandomCode().substring(0, num); + } + }else{ + throw new Exception("参数只能大于0"); + } + return str; + } + + + /** + * 获取根据当前时间的字符串数据 + * @return + */ + public synchronized static String getTimeStr(){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmssS"); + return simpleDateFormat.format(new Date()); + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java new file mode 100644 index 0000000..28c2683 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EmployeeUtil.java @@ -0,0 +1,250 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.open.common.util.OpenApiClient; +import com.open.common.util.SystemParameterNames; +import com.stylefeng.guns.modular.system.util.ResultUtil; +import com.stylefeng.guns.modular.system.util.SpringContextsUtil; +import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 企业员工工具类 + * @author zhibing.pu + * @Date 2025/6/6 16:17 + */ +@Slf4j +public class EmployeeUtil { + + private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig(); + + public static void main(String[] args) { +// SaveStaffNodeRequest request = new SaveStaffNodeRequest(); +// request.setMobile("18798410042"); +// request.setEntercode("9811000039358999"); +// request.setEmpName("莫萍"); +// request.setEmpNickname("莫萍"); +// request.setLoginNo("15180824124"); +// request.setEmpSex("女"); +// request.setMphone("15180824124"); +// request.setEmail("15180824124" + "@qyt.com"); +// request.setDeptId(0); +// request.setPositionId(1); +// request.setSuperLevel(0); +// request.setHideMobile(0); +// SaveStaffNode saveStaffNode = EmployeeUtil.saveStaffNode(request); +// System.out.println(saveStaffNode); + + + +// DeleteStafNodeRequest deleteStafNodeRequest = new DeleteStafNodeRequest(); +// deleteStafNodeRequest.setEmpId(11451968L); +// deleteStafNodeRequest.setEntercode("981100006318563"); +// deleteStafNodeRequest.setMobile("13688394165"); +// EmployeeUtil.ecrmDeleteStafNode(deleteStafNodeRequest); + } + + + /** + * 企业修改员工信息 + * @param request + * @return + */ + public static ResultUtil editStaffNode(EditStaffNodeRequest request){ + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/editStaffNode"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【企业修改员工信息】请求地址:" + url); + log.info("【企业修改员工信息】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【企业修改员工信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【企业修改员工信息】请求失败:" + result); + String retMsg = jsonObject.getString("retMsg"); + retMsg = retMsg.substring(retMsg.indexOf("{")); + jsonObject = JSON.parseObject(retMsg); + return ResultUtil.error("【企业修改员工信息】请求失败:" + jsonObject.getString("msg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【企业修改员工信息】失败:" + object.toJSONString()); + return ResultUtil.error("【企业修改员工信息】失败:" + object.toJSONString()); + } + return ResultUtil.success(); + } + + + /** + * 企业删除人员 + * @param request + * @return + */ + public static ResultUtil ecrmDeleteStafNode(DeleteStafNodeRequest request){ + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/ecrmDeleteStafNode"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + String content = "";//业务参数 + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【企业删除人员】请求地址:" + url); + log.info("【企业删除人员】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【企业删除人员】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【企业删除人员】请求失败:" + result); + String retMsg = jsonObject.getString("retMsg"); + retMsg = retMsg.substring(retMsg.indexOf("{")); + jsonObject = JSON.parseObject(retMsg); + return ResultUtil.error("【企业删除人员】请求失败:" + jsonObject.getString("msg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【企业删除人员】失败:" + object.toJSONString()); + return ResultUtil.error("【企业删除人员】失败:" + object.getString("desc")); + } + return ResultUtil.success(); + } + + + /** + * 根据员工ID获取人员信息 + * @param request + * @return + */ + public static StaffNodeInfo getStaffNode(GetStaffNodeRequest request){ + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/getStaffNode"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【根据员工ID获取人员信息】请求地址:" + url); + log.info("【根据员工ID获取人员信息】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "GET", skprivateKeyFile, timeStamp, contentMap); + log.info("【根据员工ID获取人员信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【根据员工ID获取人员信息】请求失败:" + result); + return null; + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【根据员工ID获取人员信息】失败:" + object.toJSONString()); + return null; + } + StaffNodeInfo staffNodeInfo = object.getObject("data", StaffNodeInfo.class); + return staffNodeInfo; + } + + /** + * 企业增加员工 + * @param request + * @return + */ + public static ResultUtil<SaveStaffNode> saveStaffNode(SaveStaffNodeRequest request){ + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/saveStaffNode"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【企业增加员工】请求地址:{}", url); + log.info("【企业增加员工】请求参数:{}", JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【企业增加员工】请求结果:{}", result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【企业增加员工】请求失败:{}", result); + String retMsg = jsonObject.getString("retMsg"); + if(retMsg.contains("员工昵称已存在")){ + request.setEmpName(request.getEmpName() + Double.valueOf(Math.random() * 100).intValue()); + request.setEmpNickname(request.getEmpName()); + return saveStaffNode(request); + } + retMsg = retMsg.substring(retMsg.indexOf("{")); + jsonObject = JSON.parseObject(retMsg); + return ResultUtil.error("【企业增加员工】请求失败:" + jsonObject.getString("msg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【企业增加员工】失败:{}", object.toJSONString()); + return ResultUtil.error("【企业增加员工】失败:" + object.getString("desc")); + } + SaveStaffNode saveStaffNode = object.getObject("data", SaveStaffNode.class); + return ResultUtil.success(saveStaffNode); + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java new file mode 100644 index 0000000..f5ac4ae --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/EnterpriseUtil.java @@ -0,0 +1,327 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.open.common.util.OpenApiClient; +import com.open.common.util.SystemParameterNames; +import com.stylefeng.guns.modular.system.util.ResultUtil; +import com.stylefeng.guns.modular.system.util.SpringContextsUtil; +import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 企业工具类 + * + * @author zhibing.pu + * @Date 2025/6/6 17:06 + */ +@Slf4j +public class EnterpriseUtil { + + private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig(); + + /** + * 根据社会信用代码判断企业是否已存在 + * + * @param uscc + * @return + */ + public static CheckEnterExist checkEnterExistByEnterIdCardNo(String uscc) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/check_enter_exist_by_enterIdCardNo"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", "{\"uscc\":\"" + uscc + "\"}"); + log.info("【根据社会信用代码判断企业是否已存在】请求地址:" + url); + log.info("【根据社会信用代码判断企业是否已存在】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); + log.info("【根据社会信用代码判断企业是否已存在】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【根据社会信用代码判断企业是否已存在】请求失败:" + result); + return null; + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【根据社会信用代码判断企业是否已存在】失败:" + object.toJSONString()); + return null; + } + return jsonObject.getObject("object", CheckEnterExist.class); + } + + + /** + * 根据企业名称判断企业是否已存在 + * + * @param enterName + * @return + */ + public static CheckEnterExist checkEnterNameExist(String enterName) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/checkEnterNameExist"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", "{\"enterName\":\"" + enterName + "\"}"); + log.info("【根据企业名称判断企业是否已存在】请求地址:" + url); + log.info("【根据企业名称判断企业是否已存在】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); + log.info("【根据企业名称判断企业是否已存在】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【根据企业名称判断企业是否已存在】请求失败:" + result); + return null; + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【根据企业名称判断企业是否已存在】失败:" + object.toJSONString()); + return null; + } + return jsonObject.getObject("object", CheckEnterExist.class); + } + + + /** + * 查询企业详情 + * + * @param enter_code 企业编号 + * @return + */ + public static EnterpriseInfo getEnterpriseDetail(String enter_code) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/getEnterpriseDetail"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", "{\"enter_code\":\"" + enter_code + "\"}"); + log.info("【查询企业详情】请求地址:" + url); + log.info("【查询企业详情】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); + log.info("【查询企业详情】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【查询企业详情】请求失败:" + result); + return null; + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【查询企业详情】失败:" + object.toJSONString()); + return null; + } + EnterpriseInfo enterpriseInfo = jsonObject.getObject("object", EnterpriseInfo.class); + return enterpriseInfo; + } + + + /** + * 修改企业基本信息 + * + * @param request + * @return + */ + public static Boolean modifyEnterpriseInfo(ModifyEnterpriseInfoRequest request) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/modifyEnterpriseInfo"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", new Gson().toJson(request)); + log.info("【修改企业基本信息】请求地址:" + url); + log.info("【修改企业基本信息】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "GET", skprivateKeyFile, timeStamp, map); + log.info("【修改企业基本信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String status = jsonObject.getString("retCode"); + if (!"0".equals(status)) { + log.error("【修改企业基本信息】请求失败:" + result); + throw new RuntimeException("【修改企业基本信息】请求失败:" + result); + } + return true; + } + + + /** + * 创建企业 + * + * @param request + * @return + */ + public static CreateEnterprise createEnterprise(CreateEnterpriseRequest request) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/createEnterprise"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", new Gson().toJson(request)); + + log.info("【创建企业】请求地址:" + url); + log.info("【创建企业】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); + log.info("【创建企业】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【创建企业】请求失败:" + result); + String retMsg = jsonObject.getString("retMsg"); + retMsg = retMsg.substring(retMsg.indexOf("{")); + jsonObject = JSON.parseObject(retMsg); + throw new RuntimeException("【创建企业】请求失败:" + jsonObject.getString("msg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【创建企业】请求失败:" + object.toJSONString()); + throw new RuntimeException("【创建企业】请求失败:" + object.toJSONString()); + } + return object.getObject("data", CreateEnterprise.class); + } + + + /** + * 删除企业信息 + * + * @param enterNum 企业编号 + * @param operator 管理员手机号码 + * @return + */ + public static ResultUtil delEnterprise(String enterNum, String operator) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/delCompany"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> map = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + map.put(SystemParameterNames.getAppKey(), appKey); + map.put(SystemParameterNames.getMessage_id(), messageId); + map.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + map.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + map.put("content", "{\"enterNum\":\"" + enterNum + "\",\"operator\":\"" + operator + "\"}"); + + log.info("【删除企业信息】请求地址:" + url); + log.info("【删除企业信息】请求参数:" + JSON.toJSONString(map)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, map); + log.info("【删除企业信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【删除企业信息】请求失败:" + result); + String retMsg = jsonObject.getString("retMsg"); + retMsg = retMsg.substring(retMsg.indexOf("{")); + jsonObject = JSON.parseObject(retMsg); + return ResultUtil.error("【删除企业信息】请求失败:" + jsonObject.getString("msg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【删除企业信息】请求失败:" + object.toJSONString()); + return ResultUtil.error("【删除企业信息】请求失败:" + object.getString("desc")); + } + return ResultUtil.success(); + } + + + public static void main(String[] args) { +// CreateEnterpriseRequest request = new CreateEnterpriseRequest(); +// request.setName("黔南云码通数字产业运营有限公司"); +// request.setNickName("黔南云码通"); +// request.setIndustry_code("123456789"); +// request.setMobile("15180824124"); +// request.setMobileFlag("1"); +// CreateEnterprise enterprise = EnterpriseUtil.createEnterprise(request); +// System.out.println(enterprise); +// + +// CheckEnterExist checkEnterExist = EnterpriseUtil.checkEnterNameExist("黔南云码通数字产业运营有限公司"); +// System.out.println(checkEnterExist); + + + EnterpriseUtil.delEnterprise("981100006318563", "13688394165"); + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java new file mode 100644 index 0000000..5e57d68 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java @@ -0,0 +1,830 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.open.common.util.OpenApiClient; +import com.open.common.util.SystemParameterNames; +import com.stylefeng.guns.modular.system.util.SpringContextsUtil; +import com.stylefeng.guns.modular.system.util.UUIDUtil; +import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author zhibing.pu + * @Date 2025/7/24 9:34 + */ +@Slf4j +public class OrderUtil { + + private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig(); + + + public static void main(String[] args) { + //创建行程 +// CreateTravelItineraryRequest request = new CreateTravelItineraryRequest(); +// request.setScene("TRAFFIC"); +// request.setPartnerId("522700"); +// request.setOrderNo("3456789012345678"); +// request.setCustomerId("11448156"); +// request.setDriverId("11448158"); +// request.setSupplierShopId("981100006005951"); +// request.setServiceType(1); +// String travelItinerary = createTravelItinerary(request); +// System.err.println(travelItinerary);//1951088602595872768 + + //修改行程状态 +// ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest(); +// request.setScene("TRAFFIC"); +// request.setPartnerId("522700"); +// request.setOrderId("1951088602595872768"); +// request.setStatus(7); +// request.setDriverId("11448158"); +// request.setSupplierShopId("981100006005951"); +// Boolean aBoolean = modifyTravelItinerary(request); + + //订单创建及拉起支付 +// TradeOrderCreateData tradeOrderCreateData = new TradeOrderCreateData(); +// tradeOrderCreateData.setScene("TRAFFIC"); +// tradeOrderCreateData.setPartnerId("522700"); +// tradeOrderCreateData.setTreatShopId("11448158"); +// tradeOrderCreateData.setOrderAppId("52270015"); +// tradeOrderCreateData.setField1("{\"profitSharing\":\"1\",\"isPromote\":\"0\"}"); +// tradeOrderCreateData.setCharge(new BigDecimal("0.01")); +// tradeOrderCreateData.setChannelSource("GRJYCXWXXCX"); +// tradeOrderCreateData.setOrderId("1951088602595872768"); +// tradeOrderCreateData.setOrderNo("3456789012345678"); +// tradeOrderCreateData.setCustomerId("11448156"); +// tradeOrderCreateData.setPayPartnerId("5400004"); +// tradeOrderCreateData.setPartnerPayId("1951088602595872768"); +// tradeOrderCreateData.setCurrency("RMB"); +// tradeOrderCreateData.setTotalFee("1"); +// tradeOrderCreateData.setRetUrl("pages/advoad-city-search/advoad-message/electronic-wait-pay/electronic-wait-pay"); +// tradeOrderCreateData.setClientIp("127.0.0.1"); +// tradeOrderCreateData.setNeedLoginFlag("N"); +// tradeOrderCreateData.setOrderDesc("出行订单支付"); +// tradeOrderCreateData.setAccessMode("APP"); +// +// List<GoodsInfoRequest> goodsInfo = new ArrayList<>(); +// GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); +// goodsInfoRequest.setId("981100006005901"); +// goodsInfoRequest.setSubAppId("wxcc3c9058e2b294db"); +// goodsInfoRequest.setSubOpenId("oVLur61wBKJEO7QPR1dsmzS5TSfs"); +// goodsInfoRequest.setProfitSharing("1"); +// goodsInfoRequest.setAreaInfo("520100"); +// goodsInfoRequest.setPayType("0"); +// goodsInfoRequest.setBusinessType("10408"); +// goodsInfo.add(goodsInfoRequest); +// tradeOrderCreateData.setGoodsInfo(goodsInfo); +// TradeOrderCreate tradeOrderCreate = tradeOrderCreate1(tradeOrderCreateData); +// System.err.println(tradeOrderCreate); + //TradeOrderCreate(orderInfo=OrderInfo(orderId=1950072223939842048, status=null), payInfo=PayInfo(retCode=000000, retMsg=success, success=true, data=PayInfoData(redirectUrl=https://qhsctest.qytzt.cn/gray/mobile/index.html?f=allCashDesk&accessToken=It5FPM1DUjzwIAin7zwiHvUANWKC6I5USCLE8EKoRkg%3D, payId=540000420250729000135600, status=null, payTime=null, payFee=null, paymentInfos=null), sign=525cb843b1eeb5a0451eeb5fbbe02f0f)) + + //查询支付单信息 +// GetPaymentInfoDataRequest getPaymentInfoDataRequest = new GetPaymentInfoDataRequest(); +// getPaymentInfoDataRequest.setPartnerId("5400004"); +// getPaymentInfoDataRequest.setPartnerPayId("1948685426689200128"); +// GetPaymentInfo getPaymentInfo = paymentInfo(getPaymentInfoDataRequest); +// System.err.println(getPaymentInfo); + + //拉起支付 +// TradePayOff1Data tradePayOff1Data = new TradePayOff1Data(); +// tradePayOff1Data.setPartnerId("5400004"); +// tradePayOff1Data.setScene("TRAFFIC"); +// tradePayOff1Data.setPartnerPayId("1951088602595872768"); +// tradePayOff1Data.setCurrency("RMB"); +// tradePayOff1Data.setTotalFee("1"); +// tradePayOff1Data.setRetUrl("pages/advoad-city-search/advoad-message/electronic-wait-pay/electronic-wait-pay"); +// tradePayOff1Data.setClientIp("127.0.0.1"); +// tradePayOff1Data.setNeedLoginFlag("N"); +// tradePayOff1Data.setOrderDesc("出行订单支付"); +// tradePayOff1Data.setAccessMode("APP"); +// List<GoodsInfoRequest> goodsInfo = new ArrayList<>(); +// GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest(); +// goodsInfoRequest.setId("981100006005901"); +// goodsInfoRequest.setSubAppId("wxcc3c9058e2b294db"); +// goodsInfoRequest.setSubOpenId("oVLur61wBKJEO7QPR1dsmzS5TSfs"); +// goodsInfoRequest.setProfitSharing("1"); +// goodsInfoRequest.setAreaInfo("520100"); +// goodsInfoRequest.setPayType("0"); +// goodsInfoRequest.setBusinessType("10408"); +// goodsInfo.add(goodsInfoRequest); +// tradePayOff1Data.setGoodsInfo(goodsInfo); +// PayInfo payInfo = tradePayOff1(tradePayOff1Data); +// System.err.println(payInfo); + //PayInfo(retCode=000000, retMsg=success, success=true, data=PayInfoData(redirectUrl=https://qhsctest.qytzt.cn/gray/mobile/index.html?f=allCashDesk&accessToken=5nUBXayFpfZz%2FXUZiMu9LzeRXmqmlqaCS%2BHfu5udIt4%3D, payId=540000420250725000135549, status=null, payTime=null, payFee=null, paymentInfos=null), sign=8154ba2728280900b122c56352c1c7fe) + + + // (补偿单)拉起支付 +// TradePayOffData tradePayOffData = new TradePayOffData(); +// tradePayOffData.setPartnerId("5400004"); +// tradePayOffData.setScene("TRAFFIC"); +// tradePayOffData.setPartnerPayId("1948685426689200128"); +// tradePayOffData.setCurrency("RMB"); +// tradePayOffData.setTotalFee("1"); +// tradePayOffData.setRetUrl("/home/"); +// tradePayOffData.setClientIp("127.0.0.1"); +// tradePayOffData.setNeedLoginFlag("N"); +// tradePayOffData.setOrderDesc("出行订单支付"); +// tradePayOffData.setAccessMode("APP"); +// List<PaymentInfoRequest> paymentInfoRequests = new ArrayList<>(); +// PaymentInfoRequest paymentInfoRequest = new PaymentInfoRequest(); +// paymentInfoRequest.setPayModeId("501212"); +// paymentInfoRequests.add(paymentInfoRequest); +// tradePayOffData.setPaymentInfos(paymentInfoRequests); +// List<GoodsInfo> goodsInfo = new ArrayList<>(); +// GoodsInfo goodsInfo1 = new GoodsInfo(); +// goodsInfo1.setMerchantCode(""); +// goodsInfo1.setCustId(""); +// goodsInfo1.setCustName(""); +// goodsInfo1.setProfitSharing("1"); +// goodsInfo.add(goodsInfo1); +// tradePayOffData.setGoodsInfo(goodsInfo); +// PayInfo payInfo1 = tradePayOff(tradePayOffData); +// System.err.println(payInfo1); + + //订单创建 +// CreateOrderRequest createOrderRequest = new CreateOrderRequest(); +// createOrderRequest.setTreatShopId("11448158"); +// createOrderRequest.setOrderAppId("52270015"); +// createOrderRequest.setScene("TRAFFIC"); +// createOrderRequest.setPartnerId("522700"); +// createOrderRequest.setField1("{\"profitSharing\":\"1\",\"isPromote\":\"0\"}"); +// createOrderRequest.setCharge(new BigDecimal("0.01")); +// createOrderRequest.setChannelSource("GRJYCXWXXCX"); +// createOrderRequest.setOrderId("1948685426689200128"); +// createOrderRequest.setOrderNo("0123456"); +// createOrderRequest.setCustomerId("11448156"); +// OrderInfo orderInfo = tradeOrderCreate(createOrderRequest); +// System.err.println(orderInfo); + + //行程单列表查询 +// GetTravelItineraryListRequest request = new GetTravelItineraryListRequest(); +// request.setScene("TRAFFIC"); +// request.setPartnerId("522700"); +// request.setCustomerId("11448156"); +// request.setOrderNo("0123456"); +// request.setDriverId("11448158"); +// ListPage<TravelItinerary> travelItineraryList = getTravelItineraryList(request); +// System.err.println(travelItineraryList); + + } + + /** + * 拉起支付 + * + * @param tradePayOff1Data + * @return + */ + public static PayInfo tradePayOff1(TradePayOff1Data tradePayOff1Data) { + tradePayOff1Data.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004"); + tradePayOff1Data.setTimeout("72H"); + tradePayOff1Data.setScene("TRAFFIC"); + tradePayOff1Data.setCurrency("RMB"); + tradePayOff1Data.setNeedLoginFlag("N"); + tradePayOff1Data.setAccessMode("APP"); + tradePayOff1Data.getGoodsInfo().forEach(goodsInfoRequest -> { + goodsInfoRequest.setId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "9811000039358999" : "981100006005901"); + goodsInfoRequest.setSubAppId("wxcc3c9058e2b294db"); + + goodsInfoRequest.setAreaInfo("520100"); + goodsInfoRequest.setPayType("0"); + goodsInfoRequest.setBusinessType("10408"); + }); + + + TradeRequest request = new TradeRequest<TradePayOff1Data>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954795404533583872" : "1911676727023968256"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion(1); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(tradePayOff1Data); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradePayOff"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【拉起支付】请求地址:" + url); + log.info("【拉起支付】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【拉起支付】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【拉起支付】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【拉起支付】失败:" + jsonObject.getString("resMsg")); + } + JSONObject busiResp = jsonObject.getJSONObject("busiResp"); + PayInfo payInfo = busiResp.getObject("payInfo", PayInfo.class); + return payInfo; + } + + /** + * 创建行程单 + * + * @param request + * @return 行程单ID + */ + public static String createTravelItinerary(CreateTravelItineraryRequest request) { + request.setScene("TRAFFIC"); + request.setPartnerId("522700"); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/createTravelItinerary"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【创建行程单】请求地址:" + url); + log.info("【创建行程单】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【创建行程单】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【创建行程单】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【创建行程单】失败:" + jsonObject.getString("resMsg")); + } + return jsonObject.getString("busiResp"); + } + + + /** + * 修改行程单 + * + * @param request + */ + public static Boolean modifyTravelItinerary(ModifyTravelItineraryRequest request) { + request.setScene("TRAFFIC"); + request.setPartnerId("522700"); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/modifyTravelItinerary"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【修改行程单】请求地址:" + url); + log.info("【修改行程单】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【修改行程单】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【修改行程单】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【修改行程单】失败:" + jsonObject.getString("resMsg")); + } + return true; + } + + + /** + * 行程单列表查询 + * + * @param request + * @return + */ + public static ListPage<List<TravelItinerary>> getTravelItineraryList(GetTravelItineraryListRequest request) { + request.setScene("TRAFFIC"); + request.setPartnerId("522700"); + + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/getTravelItineraryList"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【行程单列表查询】请求地址:" + url); + log.info("【行程单列表查询】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【行程单列表查询】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【行程单列表查询】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【行程单列表查询】失败:" + jsonObject.getString("resMsg")); + } + JSONObject busiResp = jsonObject.getJSONObject("busiResp"); + Integer total = busiResp.getInteger("total"); + Integer pageNum = busiResp.getInteger("pageNum"); + Integer pageSize = busiResp.getInteger("pageSize"); + JSONArray list = busiResp.getJSONArray("list"); + List<TravelItinerary> travelItineraryList = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + TravelItinerary object = list.getObject(i, TravelItinerary.class); + travelItineraryList.add(object); + } + ListPage listPage = new ListPage<List<TravelItinerary>>(); + listPage.setTotal(total); + listPage.setPageNum(pageNum); + listPage.setPageSize(pageSize); + listPage.setList(travelItineraryList); + return listPage; + } + + /** + * 订单创建及拉起支付 + * + * @param tradeOrderCreateData + * @return + */ + public static TradeOrderCreate tradeOrderCreate1(TradeOrderCreateData tradeOrderCreateData) { + tradeOrderCreateData.setScene("TRAFFIC"); + tradeOrderCreateData.setPartnerId("522700"); + tradeOrderCreateData.setTimeout("72H"); + tradeOrderCreateData.setOrderAppId("52270015"); + tradeOrderCreateData.setChannelSource("GRJYCXWXXCX"); + tradeOrderCreateData.setPayPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004"); + tradeOrderCreateData.setCurrency("RMB"); + tradeOrderCreateData.setNeedLoginFlag("N"); + tradeOrderCreateData.setAccessMode("APP"); + tradeOrderCreateData.getGoodsInfo().forEach(goodsInfoRequest -> { + goodsInfoRequest.setId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "9811000039358999" : "981100006005901"); + goodsInfoRequest.setSubAppId("wxcc3c9058e2b294db"); + goodsInfoRequest.setAreaInfo("520100"); + goodsInfoRequest.setPayType("0"); + goodsInfoRequest.setBusinessType("10408"); + }); + + + TradeRequest request = new TradeRequest<TradeOrderCreateData>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954793280550756352" : "1945688132719169536"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion(1); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(tradeOrderCreateData); + + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderCreate"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【订单创建及拉起支付】请求地址:" + url); + log.info("【订单创建及拉起支付】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【订单创建及拉起支付】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【订单创建及拉起支付】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【订单创建及拉起支付】失败:" + jsonObject.getString("resMsg")); + } + TradeOrderCreate busiResp = jsonObject.getObject("busiResp", TradeOrderCreate.class); + return busiResp; + } + + /** + * 订单创建 + * + * @param createOrderRequest + * @return + */ + public static OrderInfo tradeOrderCreate(CreateOrderRequest createOrderRequest) { + createOrderRequest.setOrderAppId("52270015"); + createOrderRequest.setScene("TRAFFIC"); + createOrderRequest.setPartnerId("522700"); + createOrderRequest.setChannelSource("GRJYCXWXXCX"); + + TradeRequest request = new TradeRequest<CreateOrderRequest>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954792737421942784" : "1948289607125864448"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion(1); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(createOrderRequest); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderCreate"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【订单创建】请求地址:" + url); + log.info("【订单创建】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【订单创建】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【订单创建】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【订单创建】失败:" + jsonObject.getString("resMsg")); + } + JSONObject busiResp = jsonObject.getJSONObject("busiResp"); + OrderInfo orderInfo = busiResp.getObject("orderInfo", OrderInfo.class); + return orderInfo; + } + + /** + * (补偿单)拉起支付 + * + * @param tradePayOffData + * @return + */ + public static PayInfo tradePayOff(TradePayOffData tradePayOffData) { + tradePayOffData.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401008" : "5400005"); + tradePayOffData.setTimeout("72H"); + tradePayOffData.setScene("TRAFFIC"); + tradePayOffData.setCurrency("RMB"); + tradePayOffData.setRetUrl(""); + InetAddress inetAddress = null; + try { + inetAddress = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + String ip = inetAddress.getHostAddress(); + tradePayOffData.setClientIp(ip); + tradePayOffData.setNeedLoginFlag("N"); + tradePayOffData.setAccessMode("APP"); + List<PaymentInfoRequest> paymentInfoRequests = new ArrayList<>(); + PaymentInfoRequest paymentInfoRequest = new PaymentInfoRequest(); + paymentInfoRequest.setPayModeId("501212"); + paymentInfoRequest.setRealFee(tradePayOffData.getTotalFee().toString()); + paymentInfoRequest.setTradeFee(tradePayOffData.getTotalFee().toString()); + paymentInfoRequest.setAccountTyp("501"); + paymentInfoRequests.add(paymentInfoRequest); + tradePayOffData.setPaymentInfos(paymentInfoRequests); + List<GoodsInfo> goodsInfo = new ArrayList<>(); + GoodsInfo goodsInfo1 = new GoodsInfo(); + goodsInfo1.setMerchantCode("prod".equals(qianYunTongConfig.getActiveProfile()) ? "B00001404" : "B00000905"); + goodsInfo1.setCustId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "CB0000004853" : "CB0000004686"); + goodsInfo1.setCustName("prod".equals(qianYunTongConfig.getActiveProfile()) ? "黔南云码通数字产业运营有限公司" : "证联消费平台交易客户"); + goodsInfo1.setBusinessType("10408"); + goodsInfo1.setAgreementNo("prod".equals(qianYunTongConfig.getActiveProfile()) ? "00000402485377063581755054680461" : "00000000468618354161754464398681"); + goodsInfo1.setProfitSharing("1"); + goodsInfo.add(goodsInfo1); + tradePayOffData.setGoodsInfo(goodsInfo); + + + TradeRequest request = new TradeRequest<TradePayOffData>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954794605782913024" : "1774717104844095488"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion("prod".equals(qianYunTongConfig.getActiveProfile()) ? 1 : 2); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(tradePayOffData); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradePayOff"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【(补偿单)拉起支付】请求地址:" + url); + log.info("【(补偿单)拉起支付】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【(补偿单)拉起支付】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【(补偿单)拉起支付】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【(补偿单)拉起支付】失败:" + jsonObject.getString("resMsg")); + } + JSONObject busiResp = jsonObject.getJSONObject("busiResp"); + PayInfo payInfo = busiResp.getObject("payInfo", PayInfo.class); + return payInfo; + } + + + /** + * 查询支付单信息 + * + * @param getPaymentInfoDataRequest + * @return + */ + public static GetPaymentInfo paymentInfo(GetPaymentInfoDataRequest getPaymentInfoDataRequest) { + getPaymentInfoDataRequest.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004"); + + GetPaymentInfoRequest request = new GetPaymentInfoRequest(); + request.setRequstType("POST"); + request.setBusType(1); + request.setData(getPaymentInfoDataRequest); + + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/paymentInfo"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【查询支付单信息】请求地址:" + url); + log.info("【查询支付单信息】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【查询支付单信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("retCode"); + if (!"0".equals(resCode)) { + log.error("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); + throw new RuntimeException("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); + } + JSONObject object = jsonObject.getJSONObject("object"); + String retCode = object.getString("retCode"); + if (!"000000".equals(retCode)) { + log.error("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); + throw new RuntimeException("【查询支付单信息】失败:" + jsonObject.getString("retMsg")); + } + GetPaymentInfo payInfo = object.getObject("data", GetPaymentInfo.class); + return payInfo; + } + + + /** + * (补偿单)支付成功通知 + * + * @param request + * @return + */ + public static OrderInfo paymentOrder(PaymentOrderRequest request) { + request.setScene("TRAFFIC"); + request.setMhltiCenterAppId("52270015"); + request.setPayType(4); + request.setPayChannel(6); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/paymentOrder"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【(补偿单)支付成功通知】请求地址:" + url); + log.info("【(补偿单)支付成功通知】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【(补偿单)支付成功通知】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【(补偿单)支付成功通知】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【(补偿单)支付成功通知】失败:" + jsonObject.getString("resMsg")); + } + OrderInfo orderInfo = jsonObject.getObject("busiResp", OrderInfo.class); + return orderInfo; + } + + + /** + * 订单退款 + * @param request1 + * @return + */ + public static TradeOrderRefund tradeOrderRefund(TradeOrderRefundRequest request1) { + request1.setPayPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004"); + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderRefund"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + TradeRequest request = new TradeRequest<TradeOrderRefundRequest>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1968487381046722560" : "1726529285264269312"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion("prod".equals(qianYunTongConfig.getActiveProfile()) ? 1 : 6); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(request1); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【订单退款】请求地址:" + url); + log.info("【订单退款】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【订单退款】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【订单退款】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【订单退款】失败:" + jsonObject.getString("resMsg")); + } + JSONObject refundInfo = jsonObject.getJSONObject("busiResp").getJSONObject("refundInfo"); + String retCode = refundInfo.getString("retCode"); + if(!"0".equals(retCode)){ + log.error("【订单退款】失败:" + refundInfo.getString("retMsg")); + throw new RuntimeException("【订单退款】失败:" + refundInfo.getString("retMsg")); + } + JSONObject object = refundInfo.getJSONObject("object"); + String retCode1 = object.getString("retCode"); + if(!"000000".equals(retCode1)){ + log.error("【订单退款】失败:" + object.getString("retMsg")); + throw new RuntimeException("【订单退款】失败:" + object.getString("retMsg")); + } + + TradeOrderRefund tradeOrderRefund = object.getObject("data", TradeOrderRefund.class); + return tradeOrderRefund; + } + + + /** + * 订单退款通知 + * @param request + */ + public static void orderRefundNotice(OrderRefundNoticeRequest request) { + request.setScene("TRAFFIC"); + request.setMhltiCenterAppId("52270015"); + + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/orderRefundNotice"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【订单退款通知】请求地址:" + url); + log.info("【订单退款通知】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【订单退款通知】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【订单退款通知】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【订单退款通知】失败:" + jsonObject.getString("resMsg")); + } + } + + + + /** + * 订单取消 + * @param orderId + */ + public static void tradeOrderCancel(String orderId) { + TradeOrderCancelRequest request1 = new TradeOrderCancelRequest(); + request1.setScene("TRAFFIC"); + request1.setMhltiCenterAppId("52270015"); + request1.setOrderId(orderId); + + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/tradeOrderCancel"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + TradeRequest request = new TradeRequest<TradeOrderRefundRequest>(); + request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1968487841979760640" : "1963507067318833152"); + request.setAppId(qianYunTongConfig.getAppkey()); + request.setConfigVersion(1); + request.setRequestId(UUIDUtil.getRandomCode()); + request.setData(request1); + + String timeStamp = date.format(nowdate); + String messageId = UUIDUtil.getRandomCode(); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【订单取消】请求地址:" + url); + log.info("【订单取消】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【订单取消】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String resCode = jsonObject.getString("resCode"); + if (!"000000".equals(resCode)) { + log.error("【订单取消】失败:" + jsonObject.getString("resMsg")); + throw new RuntimeException("【订单取消】失败:" + jsonObject.getString("resMsg")); + } + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java index 48de991..ee07ba8 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java @@ -160,7 +160,8 @@ public QianYunTongConfig getQianYunTongConfig() { if("dev".equals(activeProfile)){ this.appkey = "10001104"; - this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; +// this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; + this.privateKeyPath = "C:\\Users\\Admin\\Desktop\\private_key_test.pem"; this.userName = "xiaofei"; this.status = "1"; this.setApiUrl("https://test-zhongtai.stqcloud.com:10070"); diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/SMSUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/SMSUtil.java new file mode 100644 index 0000000..30f3850 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/SMSUtil.java @@ -0,0 +1,68 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.open.common.util.OpenApiClient; +import com.open.common.util.SystemParameterNames; +import com.stylefeng.guns.modular.system.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 短信工具类 + * @author zhibing.pu + * @Date 2025/6/10 10:48 + */ +@Slf4j +public class SMSUtil { + + private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig();; + /** + * 获取易信验证码 + * @param mobile + * @return + */ + public static String sendVerifyCode(String mobile) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/sendVerifyCode"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", "{\"mobile\":\"" + mobile + "\"}"); + log.info("【获取易信验证码】请求地址:" + url); + log.info("【获取易信验证码】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【获取易信验证码】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【获取易信验证码】请求失败:" + result); + throw new RuntimeException("【获取易信验证码】请求失败:" + result); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【获取易信验证码】失败:" + object.toJSONString()); + throw new RuntimeException("【获取易信验证码】失败:" + object.toJSONString()); + } + return object.getString("code"); + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java new file mode 100644 index 0000000..bf8db42 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java @@ -0,0 +1,272 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.open.common.util.OpenApiClient; +import com.open.common.util.SystemParameterNames; +import com.stylefeng.guns.modular.system.util.SpringContextsUtil; +import com.stylefeng.guns.modular.system.util.qianyuntong.model.*; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 用户工具类 + * + * @author zhibing.pu + * @Date 2025/6/6 14:47 + */ +@Slf4j +public class UserUtil { + + private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig(); + + /** + * 根据手机号码获取人员信息 + * + * @param mobile 手机号码 + * @param enterNum 企业编号 + */ + public static List<QYTUserInfo> getUserInfoByPhone(String mobile, String enterNum) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/getUserInfoByPhone"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + Map<String, String> map = new HashMap<>(); + map.put("mobile", mobile); + if (null != enterNum) { + map.put("enterNum", enterNum); + } + contentMap.put("content", JSON.toJSONString(map)); + log.info("【根据手机号码获取人员信息】请求地址:" + url); + log.info("【根据手机号码获取人员信息】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "GET", skprivateKeyFile, timeStamp, contentMap); + log.info("【根据手机号码获取人员信息】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【根据手机号码获取人员信息】请求失败:" + result); + return null; + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【根据手机号码获取人员信息】失败:" + object.toJSONString()); + return null; + } + JSONArray data = object.getJSONArray("data"); + List<QYTUserInfo> list = new ArrayList<>(); + for (int i = 0; i < data.size(); i++) { + data.getJSONObject(i).getString("enter_code"); + QYTUserInfo userInfo = data.getObject(i, QYTUserInfo.class); + list.add(userInfo); + } + return list; + } + + + /** + * 根据手机号注册用户 + * + * @param request + * @return + */ + public static RegisterViaMobile registerViaMobile(RegisterViaMobileRequest request) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/m1_register_via_mobile"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【根据手机号注册用户】请求地址:" + url); + log.info("【根据手机号注册用户】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【根据手机号注册用户】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【根据手机号注册用户】请求失败:" + result); + throw new RuntimeException("【根据手机号注册用户】请求失败:" + result); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【根据手机号注册用户】失败:" + object.toJSONString()); + throw new RuntimeException("【根据手机号注册用户】失败:" + object.toJSONString()); + } + return jsonObject.getObject("object", RegisterViaMobile.class); + } + + + /** + * 易信用户修改密码 + * + * @param request + * @return + */ + public static Boolean modifyPwd(ModifyPwdRequest request) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/modifyPwd"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【易信用户修改密码】请求地址:" + url); + log.info("【易信用户修改密码】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【易信用户修改密码】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【易信用户修改密码】请求失败:" + result); + throw new RuntimeException("【易信用户修改密码】请求失败:" + result); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【易信用户修改密码】失败:" + object.toJSONString()); + throw new RuntimeException("【易信用户】失败:" + object.toJSONString()); + } + return true; + } + + + /** + * 易信重置密码 + * + * @param request + * @return + */ + public static Boolean resetPwd(ResetPwdRequest request) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/resetPwd"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + contentMap.put("content", new Gson().toJson(request)); + log.info("【易信重置密码】请求地址:" + url); + log.info("【易信重置密码】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【易信重置密码】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【易信重置密码】请求失败:" + result); + throw new RuntimeException("【易信重置密码】请求失败:" + result); + } + JSONObject object = jsonObject.getJSONObject("object"); + String status = object.getString("status"); + if (!"0".equals(status)) { + log.error("【易信重置密码】失败:" + object.toJSONString()); + throw new RuntimeException("【易信重置密码】失败:" + object.toJSONString()); + } + return true; + } + + + + + /** + * 实名认证 + * @param realName + * @param cardNo + * @return + */ + public static Boolean idCardAuth(String realName, String cardNo) { + //请求路径 + String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/idCardAuth"; + //私钥文件 + String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath(); + //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密 + String appKey = qianYunTongConfig.getAppkey();//appkey + Map<String, String> headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + Map<String, Object> contentMap = new HashMap<String, Object>(); + Date nowdate = new Date(); + SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss"); + + String timeStamp = date.format(nowdate); + String messageId = UUID.randomUUID().toString().replaceAll("-", ""); + contentMap.put(SystemParameterNames.getAppKey(), appKey); + contentMap.put(SystemParameterNames.getMessage_id(), messageId); + contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName()); + contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus()); + Map<String, String> map = new HashMap<>(); + map.put("realName", realName); + map.put("cardNo", cardNo); + contentMap.put("content", JSON.toJSONString(map)); + log.info("【身份证实名认证】请求地址:" + url); + log.info("【身份证实名认证】请求参数:" + JSON.toJSONString(contentMap)); + String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap); + log.info("【身份证实名认证】请求结果:" + result); + JSONObject jsonObject = JSON.parseObject(result); + String retCode = jsonObject.getString("retCode"); + if (!"0".equals(retCode)) { + log.error("【身份证实名认证】请求失败:" + result); + throw new RuntimeException("【身份证实名认证】请求失败:" + result); + } + JSONObject object = jsonObject.getJSONObject("object"); + return object.getBoolean("isok"); + } + + public static void main(String[] args) { + List<QYTUserInfo> userInfoByPhone = getUserInfoByPhone("13688394165", "981100006318563"); + System.out.println(userInfoByPhone); + } +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateOrderRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateOrderRequest.java new file mode 100644 index 0000000..2201301 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateOrderRequest.java @@ -0,0 +1,53 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author zhibing.pu + * @Date 2025/7/24 9:35 + */ +@Data +public class CreateOrderRequest { + /** + * 司机id + */ + private String treatShopId; + /** + * 应用场景标识 + */ + private String orderAppId; + /** + * 场景标识 + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 结算信息json串。其中结算分账标识(profitSharing:0:不分账,1:分账)、是否推广单标识(isPromote:1、是、0、否)必传。例:{"profitSharing":"0",”isPromote”:”0”} + */ + private String field1; + /** + * 订单总金额,单位元 + */ + private BigDecimal charge; + /** + * 订单渠道。小程序传GRJYCXWXXCX,贵人家园传GRJY + */ + private String channelSource; + /** + * 行程单ID + */ + private String orderId; + /** + * 业务侧订单号 + */ + private String orderNo; + /** + * 下单人ID + */ + private String customerId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateTravelItineraryRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateTravelItineraryRequest.java new file mode 100644 index 0000000..8ce9043 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/CreateTravelItineraryRequest.java @@ -0,0 +1,43 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 16:31 + */ +@Data +public class CreateTravelItineraryRequest { + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 业务侧订单号 + */ + private String orderNo; + /** + * 乘客ID + */ + private String customerId; + /** + * 司机ID + */ + private String driverId; + /** + * 推广员ID + */ + private String promoterId; + /** + * 服务商商户ID + */ + private String supplierShopId; + /** + * 场景服务类型。1、出租;2、网约车;3、城际;4、顺风车 + */ + private Integer serviceType; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfo.java new file mode 100644 index 0000000..7ce17dc --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfo.java @@ -0,0 +1,53 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 18:24 + */ +@Data +public class GetPaymentInfo { + /** + * 支付流水号 + */ + private String payId; + /** + * 订单中心行程单ID + */ + private String partnerPayId; + /** + * 接入模式:PC H5 APP + */ + private String accessMode; + /** + * 用户标识 + */ + private String customerId; + /** + * 商户标识 + */ + private String partnerId; + /** + * 币种 + */ + private String currency; + /** + * 支付总金额 + */ + private String totalFee; + /** + * 支付工单状态 + * 0 待支付 + * 1 部分支付成功 + * 2 支付成功 + * 3 支付失败 + */ + private String status; + /** + * 商品信息 + */ + private List<GoodsInfoRequest> goodsInfo; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoDataRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoDataRequest.java new file mode 100644 index 0000000..c7828b8 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoDataRequest.java @@ -0,0 +1,19 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 17:08 + */ +@Data +public class GetPaymentInfoDataRequest { + /** + * 支付单标识。传行程单ID + */ + private String partnerPayId; + /** + * 商户号,由支付中心分配 + */ + private String partnerId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoRequest.java new file mode 100644 index 0000000..dfd62c0 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetPaymentInfoRequest.java @@ -0,0 +1,23 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 17:03 + */ +@Data +public class GetPaymentInfoRequest { + /** + * 默认传POST + */ + private String requstType; + /** + * 默认传1 + */ + private Integer busType; + /** + * 业务参数 + */ + private GetPaymentInfoDataRequest data; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetTravelItineraryListRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetTravelItineraryListRequest.java new file mode 100644 index 0000000..fa978a7 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GetTravelItineraryListRequest.java @@ -0,0 +1,47 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 16:31 + */ +@Data +public class GetTravelItineraryListRequest { + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 业务侧订单号 + */ + private String orderNo; + /** + * 乘客ID + */ + private String customerId; + /** + * 司机ID + */ + private String driverId; + /** + * 推广员ID + */ + private String promoterId; + /** + * 服务商商户ID + */ + private String supplierShopId; + /** + * 每页条数 + */ + private Integer pageSize; + /** + * 当前页码 + */ + private Integer pageNum; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfo.java new file mode 100644 index 0000000..8776fcc --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfo.java @@ -0,0 +1,35 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:35 + */ +@Data +public class GoodsInfo { + /** + * 商户号 + */ + private String merchantCode; + /** + * 付款商户号 + */ + private String custId; + /** + * 付款方名称 + */ + private String custName; + /** + *交通场景固定值 + */ + private String businessType; + /** + * 免密支付协议号 + */ + private String agreementNo; + /** + * 分账标识。0:不分账,1:分账 + */ + private String profitSharing; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfoRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfoRequest.java new file mode 100644 index 0000000..b3d7f21 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/GoodsInfoRequest.java @@ -0,0 +1,39 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:13 + */ +@Data +public class GoodsInfoRequest { + /** + * 企业ID(补偿场景新创建的订单支付传备用金企业ID) + */ + private String id; + /** + * 子商户微信appId(证联预下单支付必填) + */ + private String subAppId; + /** + * 付款人的openId(证联预下单支付必填) + */ + private String subOpenId; + /** + * 分账标识。0:不分账,1:分账 + */ + private String profitSharing; + /** + * 地区标识,默认传520100 + */ + private String areaInfo; + /** + * 是否匿名。默认传0 + */ + private String payType; + /** + * 业务类型,默认传10408 + */ + private String businessType; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ListPage.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ListPage.java new file mode 100644 index 0000000..eda232f --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ListPage.java @@ -0,0 +1,27 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 16:45 + */ +@Data +public class ListPage<T> { + /** + * 总条数 + */ + private Integer total; + /** + * 当前页码 + */ + private Integer pageNum; + /** + * 每页条数 + */ + private Integer pageSize; + /** + * 数据列表 + */ + private T list; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ModifyTravelItineraryRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ModifyTravelItineraryRequest.java new file mode 100644 index 0000000..f7ff87c --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/ModifyTravelItineraryRequest.java @@ -0,0 +1,39 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 16:31 + */ +@Data +public class ModifyTravelItineraryRequest { + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 行程单ID + */ + private String orderId; + /** + * 行程单状态。2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消,11=改派中 + */ + private Integer status; + /** + * 司机ID + */ + private String driverId; + /** + * 推广员ID + */ + private String promoterId; + /** + * 服务商商户ID + */ + private String supplierShopId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderInfo.java new file mode 100644 index 0000000..ef627a3 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderInfo.java @@ -0,0 +1,19 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 9:44 + */ +@Data +public class OrderInfo { + /** + * 订单id + */ + private String orderId; + /** + * 订单状态 + */ + private String status; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java new file mode 100644 index 0000000..b6aff86 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/OrderRefundNoticeRequest.java @@ -0,0 +1,49 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OrderRefundNoticeRequest { + /** + * 场景标识 + */ + private String scene; + /** + * 订单中心订单号 + */ + private String orderId; + /** + * 场景应用标识。默认52270015 + */ + private String mhltiCenterAppId; + /** + * 退款工单标识 + */ + private String refundPayNum; + /** + * 退款类型 1:未发货退款 2:未破损拒收 3:破损拒收 4:部分退款 5:全部退款 + */ + private String refundType; + /** + * 申请退款金额 + */ + private BigDecimal applyRefundCharge; + /** + * 实际退款金额 + */ + private BigDecimal actualRefundCharge; + /** + * 退款人 + */ + private String refundPerson; + /** + * 退款账号 + */ + private String refundAccount; + /** + * 退款理由 + */ + private String remark; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfo.java new file mode 100644 index 0000000..c990caa --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfo.java @@ -0,0 +1,31 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:18 + */ +@Data +public class PayInfo { + /** + * 证联返回码000000:请求成功 + */ + private String retCode; + /** + * 证联返回信息 + */ + private String retMsg; + /** + * true、false + */ + private String success; + /** + * 证联返回数据 + */ + private PayInfoData data; + /** + * 签名 + */ + private String sign; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfoData.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfoData.java new file mode 100644 index 0000000..24cf5e5 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PayInfoData.java @@ -0,0 +1,42 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:18 + */ +@Data +public class PayInfoData { + /** + * 收银台链接 + */ + private String redirectUrl; + /** + * 支付流水号 + */ + private String payId; + /** + * 支付工单状态 + * 0 待支付 + * 1 部分支付成功 + * 2 支付成功 + * 3 支付失败 + */ + private String status; + /** + * 支付时间,格式:yyyy-MM-dd HH:mm:ss + */ + private String payTime; + /** + * 扣款金额 单位分 + */ + private String payFee; + /** + * 支付信息 + */ + private List<PaymentInfo> paymentInfos; + +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfo.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfo.java new file mode 100644 index 0000000..7db70c7 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfo.java @@ -0,0 +1,31 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:32 + */ +@Data +public class PaymentInfo { + /** + * 支付模式。此场景下默认传501212(测试和生产一致) + */ + private String payModeId; + /** + * 支付交易明细标识 + */ + private String payItemId; + /** + * 支付金额 + */ + private String payFee; + /** + * 支付状态 + */ + private String status; + /** + * 支付时间 + */ + private String payTime; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfoRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfoRequest.java new file mode 100644 index 0000000..5747bf2 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentInfoRequest.java @@ -0,0 +1,27 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:32 + */ +@Data +public class PaymentInfoRequest { + /** + * 支付模式。此场景下默认传501212(测试和生产一致) + */ + private String payModeId; + /** + * 支付金额 + */ + private String realFee; + /** + * + */ + private String tradeFee; + /** + * 账户类型 501 + */ + private String accountTyp; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentOrderRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentOrderRequest.java new file mode 100644 index 0000000..ee05019 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/PaymentOrderRequest.java @@ -0,0 +1,53 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @author zhibing.pu + * @Date 2025/7/24 18:29 + */ +@Data +public class PaymentOrderRequest { + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 场景应用标识。默认52270015 + */ + private String mhltiCenterAppId; + /** + * 支付流水明细 + */ + private String payItemId; + /** + * 支付明细json串 + */ + private String paymentInfo; + /** + * 订单ID + */ + private String orderId; + /** + * 支付金额,单位元 + */ + private BigDecimal charge; + /** + * 支付时间 + */ + private String payTime; + /** + * 支付流水号 + */ + private String paymentSerialNumber; + /** + * 付款类型,4、线上支付 + */ + private Integer payType; + /** + * 付款方式,6:微信 7:支付宝 8:银行卡 9:银联二维码 10银联购物车收银台 + */ + private Integer payChannel; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallback.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallback.java new file mode 100644 index 0000000..801e14d --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallback.java @@ -0,0 +1,27 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 19:31 + */ +@Data +public class QYTPaymentCallback { + /** + * 加密字符串 + */ + private String sign; + /** + * 时间戳 + */ + private String timeStamp; + /** + * 请求调用唯一标识 + */ + private String messageId; + /** + * 支付结果信息 + */ + private QYTPaymentCallbackData data; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallbackData.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallbackData.java new file mode 100644 index 0000000..d817c71 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentCallbackData.java @@ -0,0 +1,45 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 19:34 + */ +@Data +public class QYTPaymentCallbackData { + /** + * 业务侧行程编号 + */ + private String orderNo; + /** + * 商户单标识。行程单ID + */ + private String partnerPayId; + /** + * 支付中心商户号 + */ + private String partnerId; + /** + * 支付工单标识 + */ + private String payId; + /** + * 支付状态。1.未支付 2已支付 + */ + private String status; + /** + * 支付时间,格式:YYYY-MM-DD HH:mm:ss + */ + private String payTime; + /** + * 扣款总金额 单位分 + */ + private String payFee; + /** + * 支付详细信息 + */ + private List<QYTPaymentInfoCallback> paymentInfos; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentInfoCallback.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentInfoCallback.java new file mode 100644 index 0000000..19c03d3 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/QYTPaymentInfoCallback.java @@ -0,0 +1,35 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 19:37 + */ +@Data +public class QYTPaymentInfoCallback { + /** + * 支付交易明细标识 + */ + private String payItemId; + /** + * 支付模式 + */ + private String payModeId; + /** + * 支付金额,单位分 + */ + private String payFee; + /** + * 实付金额,单位分 + */ + private String realFee; + /** + * 支付状态。1.未支付 2已支付 + */ + private String status; + /** + * 支付时间,格式:YYYY-MM-DD HH:mm:ss + */ + private String payTime; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java new file mode 100644 index 0000000..4b7ff36 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/RefundInfoRequest.java @@ -0,0 +1,19 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class RefundInfoRequest { + /** + * 支付交易明细标识 + */ + private String payItemId; + /** + * 支付工单标识 + */ + private String payId; + /** + * 交易金额,单位分 + */ + private String tradeFee; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/SendSmsRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/SendSmsRequest.java new file mode 100644 index 0000000..cf44a4d --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/SendSmsRequest.java @@ -0,0 +1,33 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.Map; + +/** + * @author zhibing.pu + * @Date 2025/7/2 15:41 + */ +@Data +public class SendSmsRequest { + /** + * 目标地址 + */ + private String destAddress; + /** + * 模板id + */ + private String templateId; + /** + * 参数集合 + */ + private Map<String, String> templateParams; + /** + * 模板中占位符key + */ + private String code; + /** + * 签名SPID + */ + private String spId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java new file mode 100644 index 0000000..9586188 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCancelRequest.java @@ -0,0 +1,19 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class TradeOrderCancelRequest { + /** + * 场景标识 + */ + private String scene; + /** + * 订单中心订单号 + */ + private String orderId; + /** + * 场景应用标识。默认52270015 + */ + private String mhltiCenterAppId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreate.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreate.java new file mode 100644 index 0000000..2afc392 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreate.java @@ -0,0 +1,19 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:17 + */ +@Data +public class TradeOrderCreate { + /** + * 订单信息 + */ + private OrderInfo orderInfo; + /** + * 支付接口调用信息 + */ + private PayInfo payInfo; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreateData.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreateData.java new file mode 100644 index 0000000..288fa67 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderCreateData.java @@ -0,0 +1,99 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:03 + */ +@Data +public class TradeOrderCreateData { + /** + * 司机id + */ + private String treatShopId; + /** + * 应用场景标识 + */ + private String orderAppId; + /** + * 场景标识 + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 超时时间 + */ + private String timeout; + /** + * 结算信息json串。其中结算分账标识(profitSharing:0:不分账,1:分账)、是否推广单标识(isPromote:1、是、0、否)必传。例:{"profitSharing":"0",”isPromote”:”0”} + */ + private String field1; + /** + * 订单总金额,单位元 + */ + private BigDecimal charge; + /** + * 订单渠道。小程序传GRJYCXWXXCX,贵人家园传GRJY + */ + private String channelSource; + /** + * 行程单ID + */ + private String orderId; + /** + * 业务侧订单号 + */ + private String orderNo; + /** + * 下单人ID + */ + private String customerId; + /** + * 商户号,由支付中心分配。测试环境5400004 + */ + private String payPartnerId; + /** + * 商户单标识。订单中心行程单号,每次请求请保持唯一性。 + */ + private String partnerPayId; + /** + * 币种。RMB(人民币);USD(美元) + */ + private String currency; + /** + * 交易总金额,单位分。 + */ + private String totalFee; + /** + * 前台通知URL地址。 + */ + private String retUrl; + /** + * 用户IP + */ + private String clientIp; + /** + * Y代表要登录,跳到标准收银台 + * N代表不需要登录,跳到无支付帐号收银台 + */ + private String needLoginFlag; + /** + * 支付单描述 + */ + private String orderDesc; + /** + * 接入模式:PC、H5、APP + */ + private String accessMode; + /** + * 支付信息 + */ + private List<GoodsInfoRequest> goodsInfo; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java new file mode 100644 index 0000000..8f8cc58 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefund.java @@ -0,0 +1,15 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +@Data +public class TradeOrderRefund { + /** + * 退款总金额 + */ + private String refundTotalFee; + /** + * 退款标识 + */ + private String refundId; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java new file mode 100644 index 0000000..f171ce6 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeOrderRefundRequest.java @@ -0,0 +1,42 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + + +import lombok.Data; + +import java.util.List; + +@Data +public class TradeOrderRefundRequest { + /** + * 商户号,由支付中心分配。测试环境5400004,生产环境:5401007 + */ + private String payPartnerId; + /** + * 订单中心订单号 + */ + private String partnerPayId; + /** + * 支付工单标识 + */ + private String payId; + /** + * 退款总金额,单位为分 + * 同一退款单多次发起退款请求时,退款金额必须一致 + */ + private String refundTotalFee; + /** + * 退款原因 + */ + private String remark; + /** + * 退款类型: + * RF 退款 + * BR 部分退款(目前仅集团统一支付支持部分退款) + * CZ 冲正 + */ + private String refundType; + /** + * 支付退款单明细集合 + */ + private List<RefundInfoRequest> refundInfos; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOff1Data.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOff1Data.java new file mode 100644 index 0000000..c35c201 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOff1Data.java @@ -0,0 +1,62 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:23 + */ +@Data +public class TradePayOff1Data { + /** + * 商户号,由支付中心分配。测试环境5400004 + */ + private String partnerId; + /** + * 超时时间 + */ + private String timeout; + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 商户单标识。订单中心订单号,每次请求请保持唯一性。 + */ + private String partnerPayId; + /** + * 币种。RMB(人民币);USD(美元) + */ + private String currency; + /** + * 交易总金额,单位分。 + */ + private String totalFee; + /** + * 前台通知URL地址。 + */ + private String retUrl; + /** + * 用户IP + */ + private String clientIp; + /** + * Y代表要登录,跳到标准收银台 + * N代表不需要登录,跳到无支付帐号收银台 + */ + private String needLoginFlag; + /** + * 支付单描述 + */ + private String orderDesc; + /** + * 接入模式:PC、H5、APP + */ + private String accessMode; + /** + * 商品描述信息。Json数组 + */ + private List<GoodsInfoRequest> goodsInfo; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOffData.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOffData.java new file mode 100644 index 0000000..a09e932 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradePayOffData.java @@ -0,0 +1,66 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:23 + */ +@Data +public class TradePayOffData { + /** + * 商户号,由支付中心分配。测试环境5400004 + */ + private String partnerId; + /** + * 超时时间 + */ + private String timeout; + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 商户单标识。订单中心订单号,每次请求请保持唯一性。 + */ + private String partnerPayId; + /** + * 币种。RMB(人民币);USD(美元) + */ + private String currency; + /** + * 交易总金额,单位分。 + */ + private String totalFee; + /** + * 前台通知URL地址。 + */ + private String retUrl; + /** + * 用户IP + */ + private String clientIp; + /** + * Y代表要登录,跳到标准收银台 + * N代表不需要登录,跳到无支付帐号收银台 + */ + private String needLoginFlag; + /** + * 支付单描述 + */ + private String orderDesc; + /** + * 接入模式:PC、H5、APP + */ + private String accessMode; + /** + * 支付信息 + */ + private List<PaymentInfoRequest> paymentInfos; + /** + * 商品描述信息。Json数组 + */ + private List<GoodsInfo> goodsInfo; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeRequest.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeRequest.java new file mode 100644 index 0000000..b2ce9bb --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TradeRequest.java @@ -0,0 +1,31 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 10:22 + */ +@Data +public class TradeRequest<T> { + /** + * 场景编号.交易中心提供。测试环境:1948289607125864448 + */ + private String sceneId; + /** + * 应用编号。中台应用appKey + */ + private String appId; + /** + * 场景版本。交易中心提供。测试环境1 + */ + private Integer configVersion; + /** + * 请求ID。每次调用唯一标识 + */ + private String requestId; + /** + * 业务数据 + */ + private T data; +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TravelItinerary.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TravelItinerary.java new file mode 100644 index 0000000..27ffc26 --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/model/TravelItinerary.java @@ -0,0 +1,64 @@ +package com.stylefeng.guns.modular.system.util.qianyuntong.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/7/24 16:48 + */ +@Data +public class TravelItinerary { + /** + * 场景标识。交通场景传”TRAFFIC” + */ + private String scene; + /** + * 租户ID。地区行政编码。黔南州传522700 + */ + private String partnerId; + /** + * 业务侧订单号 + */ + private String orderNo; + /** + * 乘客ID + */ + private String customerId; + /** + * 司机ID + */ + private String driverId; + /** + * 订单号 + */ + private String orderId; + /** + * 推广员ID + */ + private String promoterId; + /** + * 服务商商户ID + */ + private String supplierShopId; + /** + * 场景服务类型。1、出租;2、网约车;3、城际;4、顺风车 + */ + private Integer serviceType; + /** + * 订单状态。1、待支付,11、已完结(可结算) + */ + private Integer orderStatus; + /** + * 行程单状态。2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,9=已完成,10=已取消,11=改派中 + */ + private Integer status; + /** + * 创建时间 + */ + private String createTime; + /** + * 更新时间 + */ + private String updateTime; + +} diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginUser.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginUser.java new file mode 100644 index 0000000..c10796f --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/LoginUser.java @@ -0,0 +1,43 @@ +package com.stylefeng.guns.modular.system.warpper; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2025/6/10 20:24 + */ +@Data +public class LoginUser { + /** + * 密码 + */ + private String imPwd; + /** + * 权限编号 + */ + private String authCode; + /** + * 登录时间 + */ + private Long loginTime; + /** + * 企业编号 + */ + private String enterCode; + /** + * 用户唯一码 + */ + private String onconUUID; + /** + * 手机号 + */ + private String mobile; + /** + * 登录账号 + */ + private String imUser; + /** + * 工作角色ID + */ + private String workId; +} diff --git a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/qianyuntong/QianYunTongConfig.java b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/qianyuntong/QianYunTongConfig.java index 29b102e..ce5fd66 100644 --- a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/qianyuntong/QianYunTongConfig.java +++ b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/util/qianyuntong/QianYunTongConfig.java @@ -160,7 +160,8 @@ public QianYunTongConfig getQianYunTongConfig() { if("dev".equals(activeProfile)){ this.appkey = "10001104"; - this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; +// this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem"; + this.privateKeyPath = "C:\\Users\\Admin\\Desktop\\private_key_test.pem"; this.userName = "xiaofei"; this.status = "1"; this.setApiUrl("https://test-zhongtai.stqcloud.com:10070"); diff --git a/user/guns-admin/src/main/resources/application-dev.yml b/user/guns-admin/src/main/resources/application-dev.yml index 4726fee..58b92bd 100644 --- a/user/guns-admin/src/main/resources/application-dev.yml +++ b/user/guns-admin/src/main/resources/application-dev.yml @@ -47,7 +47,7 @@ eureka: client: service-url: #注册中心地址 - defaultZone: http://sinata:sinata@192.168.110.106:8001/eureka #启用身份验证的方式连接 + defaultZone: http://sinata:sinata@127.0.0.1:8001/eureka #启用身份验证的方式连接 register-with-eureka: true #在注册中心进行注册 fetch-registry: true #从Eureka中获取注册信息。 diff --git a/zuul/src/main/java/com/sinata/zuul/ZuulApplication.java b/zuul/src/main/java/com/sinata/zuul/ZuulApplication.java index 0ba4092..f206ad3 100644 --- a/zuul/src/main/java/com/sinata/zuul/ZuulApplication.java +++ b/zuul/src/main/java/com/sinata/zuul/ZuulApplication.java @@ -97,8 +97,8 @@ public List<SwaggerResource> get() { List resource=new ArrayList<>(); //name可以随便写,location前缀要与zuul配置的path一致。zuul开了token验证,要加上token,否则不用加?token=1 -// resource.add(swaggerResource("user","/user-server/v2/api-docs","1.0")); -// resource.add(swaggerResource("driver","/driver-server/v2/api-docs","1.0")); + resource.add(swaggerResource("user","/user-server/v2/api-docs","1.0")); + resource.add(swaggerResource("driver","/driver-server/v2/api-docs","1.0")); return resource; } diff --git a/zuul/src/main/resources/application-dev.yml b/zuul/src/main/resources/application-dev.yml index 5fc7314..86173e6 100644 --- a/zuul/src/main/resources/application-dev.yml +++ b/zuul/src/main/resources/application-dev.yml @@ -18,7 +18,7 @@ eureka: client: service-url: #注册中心地址 - defaultZone: http://sinata:sinata@192.168.110.106:8001/eureka #启用身份验证的方式连接 + defaultZone: http://sinata:sinata@127.0.0.1:8001/eureka #启用身份验证的方式连接 register-with-eureka: true #在注册中心进行注册 fetch-registry: true #从Eureka中获取注册信息。 -- Gitblit v1.7.1