Veronique 1 年之前
父節點
當前提交
24d90a4756

+ 2 - 2
conf/application-yjWebOne.xml

@@ -18,8 +18,8 @@
             <!--注入初始化code配置文件-->
             <property name="tableCodeFile" value="${APP_HOME}/conf/KeyCode.xml"/>
 
-            <property name="tableIdPrefix" value="dydeliver:tableid:"/>
-            <property name="tableCodePrefix" value="dydeliver:tablecode:"/>
+            <property name="tableIdPrefix" value="yjheating:tableid:"/>
+            <property name="tableCodePrefix" value="yjheating:tablecode:"/>
 
             <!--session过期时间-->
             <property name="sessionExpireSeconds" value="3600"/>

+ 32 - 32
conf/eskeys.properties

@@ -3,73 +3,73 @@
 #注意ES的index只能为小写
 
 #系统群发消息索引库,理论上此库只需一个即可,群发消息不会太多
-es.sysmsg.index=dydeliver_sysmsg_
+es.sysmsg.index=yjheating_sysmsg_
 
 #系统群发消息内容索引库
-es.sysmsgtext.index = dydeliver_sysmsgtext_
+es.sysmsgtext.index = yjheating_sysmsgtext_
 
 #用户对用户或者消息通知,发送给指定人的消息,暂时可以只用一个进行存储,
 #未来数据量大的情况下,可以按年份之类的条件增加索引
-es.p2pmsg.index = dydeliver_p2pmsg_
+es.p2pmsg.index = yjheating_p2pmsg_
 
 #点对点消息内容索引库
-es.p2pmsgtext.index = dydeliver_p2pmsgtext_
+es.p2pmsgtext.index = yjheating_p2pmsgtext_
 
 #用户对应消息状态,用户在登录时在群发和对点发消息库中查找未读的消息写入此库中
 #方便分页和最后的展示,理论上此库需要进行分表,可以针对用户id进行路由
-es.usermsg.index = dydeliver_usermsg_
+es.usermsg.index = yjheating_usermsg_
 
 
 #通用文件信息存储
-es.erpfile.index = dydeliver_erpfile_
+es.erpfile.index = yjheating_erpfile_
 
 #数据权限
-es.erpdatapurview.index = dydeliver_erpdatepurview_
+es.erpdatapurview.index = yjheating_erpdatepurview_
 
 #查询统计
-es.inquireinfo.index = dydeliver_inquireinfo_
+es.inquireinfo.index = yjheating_inquireinfo_
 
-es.productinfo.index = dydeliver_product_info_
-es.product.image.index = dydeliver_product_image_
+es.productinfo.index = yjheating_product_info_
+es.product.image.index = yjheating_product_image_
 
-es.workprocess.index = dydeliver_workprocess_info_
+es.workprocess.index = yjheating_workprocess_info_
 
 #施工单
-es.printbill.index = dydeliver_printbill_
-es.billstep.index = dydeliver_billstep_
-es.breedprocess.index = dydeliver_breedprocess_
+es.printbill.index = yjheating_printbill_
+es.billstep.index = yjheating_billstep_
+es.breedprocess.index = yjheating_breedprocess_
 
 #客户
-es.clientinfo.index = dydeliver_clientinfo_
-es.clientreceiveaddress.index = dydeliver_clientreceiveaddress_
+es.clientinfo.index = yjheating_clientinfo_
+es.clientreceiveaddress.index = yjheating_clientreceiveaddress_
 
 #纸张&辅料
-es.paperbaseinfo.index = dydeliver_paperbaseinfo_
-es.paperinfotype.index = dydeliver_paperinfotype_
-es.paperinfo.index = dydeliver_paperinfo_
-es.paperquoteinfo.index = dydeliver_paperquoteinfo_
+es.paperbaseinfo.index = yjheating_paperbaseinfo_
+es.paperinfotype.index = yjheating_paperinfotype_
+es.paperinfo.index = yjheating_paperinfo_
+es.paperquoteinfo.index = yjheating_paperquoteinfo_
 
-es.materialinfotype.index = dydeliver_materialinfotype_
-es.materialinfo.index = dydeliver_materialinfo_
+es.materialinfotype.index = yjheating_materialinfotype_
+es.materialinfo.index = yjheating_materialinfo_
 
 #外协
-es.outassistinfo.index = dydeliver_outassistinfo_
+es.outassistinfo.index = yjheating_outassistinfo_
 #供应商
-es.supplierInfo.index = dydeliver_supplierinfo_
+es.supplierInfo.index = yjheating_supplierinfo_
 #平台档案
-es.platforminfo.index = dydeliver_platforminfo_
+es.platforminfo.index = yjheating_platforminfo_
 #平台需求信息档案
-es.platformrequire.index = dydeliver_platformrequire_
+es.platformrequire.index = yjheating_platformrequire_
 #门店品牌档案
-es.storebrand.index = dydeliver_storebrand_
+es.storebrand.index = yjheating_storebrand_
 #门店档案
-es.storeinfo.index = dydeliver_storeinfo_
+es.storeinfo.index = yjheating_storeinfo_
 #门店已开通平台
-es.storeplatform.index = dydeliver_storeplatform_
+es.storeplatform.index = yjheating_storeplatform_
 #订单
-es.businesorder.index = dydeliver_businessorder_
+es.businesorder.index = yjheating_businessorder_
 #订单脚印
-es.orderstep.index = dydeliver_orderstep_
+es.orderstep.index = yjheating_orderstep_
 #订单退款申请
-es.refundorderrequest.index = dydeliver_refundorderrequest_
+es.refundorderrequest.index = yjheating_refundorderrequest_
 

+ 72 - 70
conf/rediskeys.properties

@@ -1,139 +1,141 @@
 # suppress inspection "UnusedProperty" for whole file
 
-redis.reqlimit=dydeliver:reqlimit
-redis.authcode=dydeliver:authcode
-redis.sessions=dydeliver:sessions
-redis.platformsupplier=dydeliver:platform:supplier
-redis.platformsuppliercode=dydeliver:platform:suppliercode
+redis.reqlimit=yjheating:reqlimit
+redis.authcode=yjheating:authcode
+redis.sessions=yjheating:sessions
+redis.platformsupplier=yjheating:platform:supplier
+redis.platformsuppliercode=yjheating:platform:suppliercode
 #单个redis节点的分布式锁
-redis.lock=dydeliver:lock
-redis.dept=dydeliver:sysdept
-redis.account=dydeliver:account
+redis.lock=yjheating:lock
+redis.dept=yjheating:sysdept
+redis.account=yjheating:account
 #存储所有的系统功能,以hash结构存储,如果内存占用高,可把key写成纯数字
-redis.sysactions=dydeliver:sysactions
+redis.sysactions=yjheating:sysactions
 #存储所有的系统菜单,以hash结构存储,如果内存占用高,可把key写成纯数字
-redis.sysmenus=dydeliver:sysmenus
+redis.sysmenus=yjheating:sysmenus
 #存储所有的系统角色,以hash结构存储,如果内存占用高,可把key写成纯数字
-redis.sysroles=dydeliver:sysroles
-redis.sysrolemenus=dydeliver:sysrolemenus
+redis.sysroles=yjheating:sysroles
+redis.sysrolemenus=yjheating:sysrolemenus
 #存储角色的菜单和功能
-redis.sysroleactions=dydeliver:sysroleactions
+redis.sysroleactions=yjheating:sysroleactions
 #存储用户角色,每个用户一个键值
 #当前服务端未保存用户和session的对应关系,导致无法快速获取用户的角色关系
 #这里在首次从数据库中获取时进行存储,在修改员工档案的时候删除键值并修改
-redis.sysuserrole=dydeliver:sysuserrole
-redis.erp.dicttype=dydeliver:erp:dicttype
+redis.sysuserrole=yjheating:sysuserrole
+redis.erp.dicttype=yjheating:erp:dicttype
 
 
 #系统配置
-redis.configvalue=dydeliver:configvalue
+redis.configvalue=yjheating:configvalue
 #字典数据
-redis.dicttype=dydeliver:dicttype
-redis.dictdata=dydeliver:dictdata
+redis.dicttype=yjheating:dicttype
+redis.dictdata=yjheating:dictdata
 
 #业务脚本
-redis.businessscript=dydeliver:businessscript
-redis.scriptcompile=dydeliver:scriptcompile
+redis.businessscript=yjheating:businessscript
+redis.scriptcompile=yjheating:scriptcompile
 
 #分厂信息
-redis.companyinfo = dydeliver:companyinfo
+redis.companyinfo = yjheating:companyinfo
 
 #消息类型
-redis.erp.noticemessage = dydeliver:noticemessage
-redis.erp.usernoticemessage = dydeliver:usernoticemessage
+redis.erp.noticemessage = yjheating:noticemessage
+redis.erp.usernoticemessage = yjheating:usernoticemessage
 
-redis.erp.pay.tradeno = dydeliver:erp:pay:tradeno
+redis.erp.pay.tradeno = yjheating:erp:pay:tradeno
 
 #消息组前缀
-redis.erp.noticemsggroup = dydeliver:noticemsggroup
+redis.erp.noticemsggroup = yjheating:noticemsggroup
 
 #登录用户,一直记录,用户登录则记录下信息
-redis.erp.loginuser = dydeliver:loginuser
-redis.erp.onlineuser = dydeliver:onlineuser
+redis.erp.loginuser = yjheating:loginuser
+redis.erp.onlineuser = yjheating:onlineuser
 
-redis.erp.personconfig = dydeliver:personconfig
+redis.erp.personconfig = yjheating:personconfig
 
-redis.formtoken = dydeliver:formtoken
-redis.formtokenex = dydeliver:formtokenex
+redis.formtoken = yjheating:formtoken
+redis.formtokenex = yjheating:formtokenex
 
 #仪表盘
-redis.cardpanel = dydeliver:cardpanel
+redis.cardpanel = yjheating:cardpanel
 
 #业务锁定数据
-redis.erplock.data = dydeliver:erplock:data
-redis.erplock.userdata = dydeliver:erplock:userdata
-redis.erplock.exclusivelockpart = dydeliver:erplock:exclusivelockpart
+redis.erplock.data = yjheating:erplock:data
+redis.erplock.userdata = yjheating:erplock:userdata
+redis.erplock.exclusivelockpart = yjheating:erplock:exclusivelockpart
 
 #版的版心尺寸
-redis.erp.breedplatesize = dydeliver:erp:breedplatesize
+redis.erp.breedplatesize = yjheating:erp:breedplatesize
 
 #查询统计
-redis.erp.inquireinfo = dydeliver:erp:inquireinfo
+redis.erp.inquireinfo = yjheating:erp:inquireinfo
 
 #分厂
-redis.company.info = dydeliver:erp:company:info
+redis.company.info = yjheating:erp:company:info
 
-redis.erp.product.parameter = dydeliver:erp:product:parameter
-redis.erp.product.info = dydeliver:erp:product:info
-redis.erp.product.detail = dydeliver:erp:product:detail
-redis.erp.product.type = dydeliver:erp:product:type
-redis.erp.product.pagePrice = dydeliver:erp:product:pagePrice
-redis.erp.product.example.image = dydeliver:erp:product:exampleImage
-redis.erp.product.room = dydeliver:erp:product:room
+redis.erp.product.parameter = yjheating:erp:product:parameter
+redis.erp.product.info = yjheating:erp:product:info
+redis.erp.product.detail = yjheating:erp:product:detail
+redis.erp.product.type = yjheating:erp:product:type
+redis.erp.product.pagePrice = yjheating:erp:product:pagePrice
+redis.erp.product.example.image = yjheating:erp:product:exampleImage
+redis.erp.product.room = yjheating:erp:product:room
 
 #单据打印次数
-redis.erp.itemprintcount = dydeliver:print:printcount
+redis.erp.itemprintcount = yjheating:print:printcount
 
-redis.erp.order.cycle.item = dydeliver:erp:cycle:item:order
+redis.erp.order.cycle.item = yjheating:erp:cycle:item:order
 
-redis.erp.print.bill.cycle.item = dydeliver:erp:cycle:item:printBill
+redis.erp.print.bill.cycle.item = yjheating:erp:cycle:item:printBill
 
 
-redis.erp.develop.client = dydeliver:erp:developclient
-redis.erp.develop.client.code = dydeliver:erp:developclientcode
+redis.erp.develop.client = yjheating:erp:developclient
+redis.erp.develop.client.code = yjheating:erp:developclientcode
 
 #机型机台
-redis.erp.machine.type = dydeliver:erp:machine:type
-redis.erp.machine.info = dydeliver:erp:machine:info
+redis.erp.machine.type = yjheating:erp:machine:type
+redis.erp.machine.info = yjheating:erp:machine:info
 
 #数据锁定
 
-redis.erp.client.industry.info = dydeliver:erp:client:industry:info
-redis.erp.client.moneybalance = dydeliver:erp:client:balance:clientmoney
-redis.erp.client.clientlevel = dydeliver:erp:client:clientlevel
+redis.erp.client.industry.info = yjheating:erp:client:industry:info
+redis.erp.client.moneybalance = yjheating:erp:client:balance:clientmoney
+redis.erp.client.clientlevel = yjheating:erp:client:clientlevel
 
 #纸张品牌
-redis.erp.paper.brand = dydeliver:erp:paper:brand
+redis.erp.paper.brand = yjheating:erp:paper:brand
 #纸张开数档案
-redis.erp.paper.cut.info = dydeliver:erp:paper:cut:info
-redis.erp.paper.cut.size.info= dydeliver:erp:paper:cut:size:info
+redis.erp.paper.cut.info = yjheating:erp:paper:cut:info
+redis.erp.paper.cut.size.info= yjheating:erp:paper:cut:size:info
 
 #平台信息档案
-redis.deliver.platforminfo = dydeliver:deliver:platforminfo
+redis.deliver.platforminfo = yjheating:deliver:platforminfo
 #平台需求条件档案
-redis.deliver.platformrequire = dydeliver:deliver:platformrequire
+redis.deliver.platformrequire = yjheating:deliver:platformrequire
 #门店品牌
-redis.deliver.storebrand = dydeliver:deliver:storebrand
+redis.deliver.storebrand = yjheating:deliver:storebrand
 #抖音上一次刷新token的时间,将废弃
-redis.douyin.lasttokendate = dydeliver:douyin:lasttokendate
+redis.douyin.lasttokendate = yjheating:douyin:lasttokendate
 #抖音当前的token,将废弃
-redis.douyin.accesstoken = dydeliver:douyin:accesstoken
+redis.douyin.accesstoken = yjheating:douyin:accesstoken
 
 #平台上一次刷新token的时间
-redis.platform.lasttokendate = dydeliver:platform:lasttokendate
+redis.platform.lasttokendate = yjheating:platform:lasttokendate
 #平台当前的token
-redis.platform.accesstoken = dydeliver:platform:accesstoken
+redis.platform.accesstoken = yjheating:platform:accesstoken
 
-redis.erp.order.shop.sequence = dydeliver:erp:order:shop:sequence
+redis.erp.order.shop.sequence = yjheating:erp:order:shop:sequence
 
-redis.erp.working.order = dydeliver:erp:working:order
-redis.erp.working.express.sf.order = dydeliver:erp:working:express:sf:order
-redis.erp.working.express.sf.store = dydeliver:erp:working:express:sf:store
+redis.erp.working.order = yjheating:erp:working:order
+redis.erp.working.express.sf.order = yjheating:erp:working:express:sf:order
+redis.erp.working.express.sf.store = yjheating:erp:working:express:sf:store
 
 #抖音推送消息msg_id
-redis.deliver.douyin.call.msgid = dydeliver:douyin:callmsgid
+redis.deliver.douyin.call.msgid = yjheating:douyin:callmsgid
 
-redis.erp.order.rider.geo = dydeliver:erp:order:rider:geo
+redis.erp.order.rider.geo = yjheating:erp:order:rider:geo
+
+redis.heating.app = yjheating:heating:app
 
 
 

+ 36 - 0
conf/script/1000/init/Init_20_HeatingApp.groovy

@@ -0,0 +1,36 @@
+import Ignore_ExecPageFlipper as ExecPageFlipper
+import com.yinjie.heating.business.dao.HeatingDocDao
+import com.yinjie.heating.business.dao.SystemDao
+import com.yinjie.heating.common.api.NoSqlKeysService
+import com.yinjie.heating.common.datas.RedisKeys
+import com.yinjie.heating.common.entity.heating.HeatingApp
+import com.yinjie.heating.common.entity.system.DictData
+import com.yinjie.heating.common.entity.system.DictType
+import com.yinjie.heating.common.tool.ERPUtils
+import com.dySweetFishPlugin.redis.RedisService
+import com.sweetfish.convert.json.JsonConvert
+import com.sweetfish.source.PageFlipper
+import org.rex.RMap
+
+static def createRunnable(RedisService redisService, NoSqlKeysService keysService, HeatingDocDao heatingDocDao, JsonConvert jsonConvert, String dataSourceId, long supplierCode) {
+    return {
+        redisService.del(keysService.getRedisKey(RedisKeys.KEY_HEATING_APP, supplierCode))
+
+        RMap dictTypeParams = ERPUtils.ofRMap("voidFlag", -1)
+        ExecPageFlipper.execute(500, { PageFlipper p ->
+
+            List<HeatingApp> heatingApps = heatingDocDao.selectAllGasApp(dictTypeParams, dataSourceId, supplierCode, p)
+            Map<String, String> heatingAppMap = heatingApps.collectEntries { [String.valueOf(it.getId()), jsonConvert.convertTo(it)] }
+
+            if (!heatingAppMap.isEmpty()) {
+                redisService.hmset(keysService.getRedisKey(RedisKeys.KEY_HEATING_APP, supplierCode), heatingAppMap)
+            }
+        })
+    } as Runnable
+}
+
+//groovy最后一个表达式的值为返回
+createRunnable(redisService, keysService, heatingDocDao, jsonConvert, dataSourceId, supplierCode)
+
+
+

+ 34 - 0
conf/sqlroot/com/yinjie/heating/business/dao/HeatingDocDao.dql

@@ -0,0 +1,34 @@
+-- [queryGasApp]
+select * from $table$;
+
+-- [insertGasApp]
+insert into $table$
+(id, appId, appName, appPublicKey,
+appPrivateKey, supplyPublicKey, status,
+verifyKind, whiteIps,
+createBy, createTime, updateBy,
+updateTime)
+values ( #{id}, #{appid}, #{appname}, #{apppublickey},
+#{appprivatekey}, #{supplypublickey}, #{status},
+#{verifykind}, #{whiteips},
+#{createby}, #{createtime}, #{updateby},
+#{updatetime} );
+
+-- [updateGasApp]
+update $table$ set
+appName = #{appname},
+appPublicKey = #{apppublickey},
+appPrivateKey = #{appprivatekey},
+supplyPublicKey = #{supplypublickey},
+verifyKind = #{verifykind},
+whiteIps = #{whiteips},
+updateBy = #{updateby},
+updateTime = #{updatetime}
+where appId = #{appid};
+
+-- [voidGasApp]
+update $table$ set
+status = #{status},
+updateBy = #{updateby},
+updateTime = #{updatetime}
+where appId = #{appid};

+ 26 - 0
yjBusiness/src/main/java/com/yinjie/heating/business/dao/HeatingDocDao.java

@@ -0,0 +1,26 @@
+package com.yinjie.heating.business.dao;
+
+import com.dySweetFishPlugin.sql.dao.*;
+import com.sweetfish.source.PageFlipper;
+import com.yinjie.heating.common.entity.heating.HeatingApp;
+import org.rex.RMap;
+
+import java.util.List;
+
+public interface HeatingDocDao extends DaoRepository {
+    @DAOMethod(operator = OperatorType.QUERY, owait = OperatorWait.AWAIT)
+    @SqlId(clazz = HeatingDocDao.class, sql = "queryGasApp", table = "htHeatingApp", params = {1})
+    List<HeatingApp> selectAllGasApp(RMap params, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode, PageFlipper pageFlipper);
+
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = HeatingDocDao.class, sql = "insertGasApp", table = "htHeatingApp", params = {1})
+    int addGasApp(HeatingApp app, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
+
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = HeatingDocDao.class, sql = "updateGasApp", table = "htHeatingApp", params = {1})
+    int updateGasApp(HeatingApp app, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
+
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = HeatingDocDao.class, sql = "voidGasApp", table = "htHeatingApp", params = {1})
+    int voidGasApp(HeatingApp app, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
+}

+ 165 - 0
yjBusiness/src/main/java/com/yinjie/heating/business/service/HeatingDocServiceImpl.java

@@ -0,0 +1,165 @@
+package com.yinjie.heating.business.service;
+
+import com.dySweetFishPlugin.redis.RedisService;
+import com.dySweetFishPlugin.sql.RMapUtils;
+import com.dySweetFishPlugin.sql.TableIdService;
+import com.sweetfish.convert.json.JsonConvert;
+import com.sweetfish.service.Local;
+import com.sweetfish.util.AutoLoad;
+import com.sweetfish.util.ResourceType;
+import com.yinjie.heating.business.dao.HeatingDocDao;
+import com.yinjie.heating.common.api.HeatingDocService;
+import com.yinjie.heating.common.base.BaseService;
+import com.yinjie.heating.common.datas.HttpCode;
+import com.yinjie.heating.common.datas.RedisKeys;
+import com.yinjie.heating.common.entity.heating.HeatingApp;
+import com.yinjie.heating.common.entity.system.LoginUser;
+import org.apache.commons.lang3.StringUtils;
+import org.rex.RMap;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@AutoLoad(false)
+@Local
+@ResourceType(HeatingDocService.class)
+public class HeatingDocServiceImpl extends BaseService implements HeatingDocService {
+    @Resource
+    RedisService redisService;
+
+    @Resource
+    JsonConvert jsonConvert;
+
+    @Resource
+    TableIdService tableIdService;
+
+    private HeatingDocDao gasDocDao;
+
+    @Override
+    public HeatingApp getRedisGasApp(String appId) {
+        String json = redisService.hget(RedisKeys.KEY_HEATING_APP, appId);
+
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+
+        return jsonConvert.convertFrom(HeatingApp.class, json);
+    }
+
+    @Override
+    public RMap getGasAppList(RMap searchData) {
+        String searchAppName = "";
+        int searchStatus = -1;
+
+        if ((searchData != null) && (searchData.containsKey("appName"))) {
+            searchAppName = searchData.getString("appName");
+        }
+
+        if ((searchData != null) && (searchData.containsKey("status"))) {
+            searchStatus = searchData.getInt("status");
+        }
+
+        Map<String, String> appMap = redisService.hgetAll(RedisKeys.KEY_HEATING_APP);
+        List<HeatingApp> appList = new ArrayList<>();
+
+        final String finalAppName = searchAppName;
+        final int finalStatus = searchStatus;
+
+        appMap.forEach((k, v) -> {
+            HeatingApp gasApp = jsonConvert.convertFrom(HeatingApp.class, v);
+            boolean canAdd = true;
+
+            if (StringUtils.isNotEmpty(finalAppName)) {
+                canAdd = canAdd && (gasApp.getAppName().contains(finalAppName));
+            }
+
+            if (finalStatus >= 0) {
+                canAdd = canAdd && (gasApp.getStatus() == finalStatus);
+            }
+
+            if (canAdd) {
+                appList.add(gasApp);
+            }
+        });
+
+        //排序
+        appList.sort((v1, v2) -> {
+            return Long.compare(v1.getId(), v2.getId());
+        });
+
+        return RMapUtils.successV2(appList, null, null);
+    }
+
+    @Override
+    public RMap addGasApp(HeatingApp app, LoginUser currentUser) {
+        app.setId(tableIdService.getTableId("tbGasApp.id", 1));
+        app.setStatus(0);
+
+        HeatingApp.create(app, currentUser.getId());
+
+        redisService.hset(RedisKeys.KEY_HEATING_APP, app.getAppId(), jsonConvert.convertTo(app));
+
+        gasDocDao.addGasApp(app);
+
+        return RMapUtils.success();
+    }
+
+    @Override
+    public RMap updateGasApp(HeatingApp app, LoginUser currentUser) {
+        if (app == null) {
+            return RMapUtils.error(HttpCode.BAD_REQUEST.value(), "请求数据错误");
+        }
+
+        if (StringUtils.isEmpty(app.getAppId())) {
+            return RMapUtils.error(HttpCode.BAD_REQUEST.value(), "请求数据错误");
+        }
+
+        HeatingApp.update(app, currentUser.getId());
+
+        HeatingApp redisApp = getRedisGasApp(app.getAppId());
+        if (redisApp != null) {
+            redisApp.setAppName(app.getAppName());
+            redisApp.setAppPublicKey(app.getAppPublicKey());
+            redisApp.setAppPrivateKey(app.getAppPrivateKey());
+            redisApp.setSupplyPublicKey(app.getSupplyPublicKey());
+            redisApp.setVerifyKind(app.getVerifyKind());
+            redisApp.setWhiteIps(app.getWhiteIps());
+            redisApp.setUpdateBy(app.getUpdateBy());
+            redisApp.setUpdateTime(app.getUpdateTime());
+
+            redisService.hset(RedisKeys.KEY_HEATING_APP, redisApp.getAppId(), jsonConvert.convertTo(redisApp));
+
+            gasDocDao.updateGasApp(app);
+        }
+
+        return RMapUtils.success();
+    }
+
+    @Override
+    public RMap voidGasApp(HeatingApp app, LoginUser currentUser) {
+        if (app == null) {
+            return RMapUtils.error(HttpCode.BAD_REQUEST.value(), "请求数据错误");
+        }
+
+        if (StringUtils.isEmpty(app.getAppId())) {
+            return RMapUtils.error(HttpCode.BAD_REQUEST.value(), "请求数据错误");
+        }
+
+        HeatingApp.update(app, currentUser.getId());
+
+        HeatingApp redisApp = getRedisGasApp(app.getAppId());
+        if (redisApp != null) {
+            redisApp.setStatus(app.getStatus());
+            redisApp.setUpdateBy(app.getUpdateBy());
+            redisApp.setUpdateTime(app.getUpdateTime());
+
+            redisService.hset(RedisKeys.KEY_HEATING_APP, redisApp.getAppId(), jsonConvert.convertTo(redisApp));
+        }
+
+        gasDocDao.voidGasApp(app);
+
+        return RMapUtils.success();
+    }
+}

+ 4 - 0
yjBusiness/src/main/java/com/yinjie/heating/business/service/SupplierInitImpl.java

@@ -130,6 +130,8 @@ public class SupplierInitImpl extends BaseService implements SupplierInitService
 
     private SystemDao systemDao;
 
+    private HeatingDocDao heatingDocDao;
+
     private ExecutorService initInfoExecutor;
 
     private final List<ScheduledThreadPoolExecutor> scheduleThreadList = new ArrayList<>();
@@ -222,6 +224,7 @@ public class SupplierInitImpl extends BaseService implements SupplierInitService
     public void start(AnyValue config) {
         systemDao = tunaService.generate(SystemDao.class);
         docDao = tunaService.generate(DocDao.class);
+        heatingDocDao = tunaService.generate(HeatingDocDao.class);
 
         AnyValue environmentValue = config.getAnyValue("environment");
         if (environmentValue != null) {
@@ -349,6 +352,7 @@ public class SupplierInitImpl extends BaseService implements SupplierInitService
                 //暂时先放在java里面初始化dao并都传递过去
                 "systemDao", systemDao,
                 "docDao", docDao,
+                "heatingDocDao", heatingDocDao,
                 "jsonConvert", jsonConvert,
                 "dataSourceId", dataSourceId,
                 "supplierCode", supplierCode,

+ 23 - 0
yjCommon/pom.xml

@@ -105,5 +105,28 @@
             <artifactId>jsoup</artifactId>
             <version>1.15.4</version>
         </dependency>
+
+        <!--xml-->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.17.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.17.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.17.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+            <version>2.17.1</version>
+        </dependency>
     </dependencies>
 </project>

+ 26 - 0
yjCommon/src/main/java/com/yinjie/heating/common/api/HeatingDocService.java

@@ -0,0 +1,26 @@
+package com.yinjie.heating.common.api;
+
+import com.yinjie.heating.common.entity.heating.HeatingApp;
+import com.yinjie.heating.common.entity.system.LoginUser;
+import org.rex.RMap;
+
+public interface HeatingDocService extends ScriptService {
+
+    HeatingApp getRedisGasApp(String appId);
+
+    /**
+     * 获取APP列表列表
+     * 从redis中获取
+     *
+     * @param searchData
+     * @return
+     */
+    RMap getGasAppList(RMap searchData);
+
+    RMap addGasApp(HeatingApp app, LoginUser currentUser);
+
+    RMap updateGasApp(HeatingApp app, LoginUser currentUser);
+
+    RMap voidGasApp(HeatingApp app, LoginUser currentUser);
+
+}

+ 1 - 1
yjCommon/src/main/java/com/yinjie/heating/common/datas/ESKeys.java

@@ -42,7 +42,7 @@ public class ESKeys {
     /**
      * 操作记录
      */
-    public static final String ESOPLOG_INDEX = "dydeliver_oplog";
+    public static final String ESOPLOG_INDEX = "yjheating_oplog";
 
 
     /**

+ 2 - 0
yjCommon/src/main/java/com/yinjie/heating/common/datas/RedisKeys.java

@@ -348,6 +348,8 @@ public class RedisKeys {
      */
     public static final String KEY_ERP_ORDER_RIDER_GEO = "redis.erp.order.rider.geo";
 
+    public static final String KEY_HEATING_APP = "redis.heating.app";
+
     private RedisKeys() {
     }
 }

+ 133 - 0
yjCommon/src/main/java/com/yinjie/heating/common/entity/ceb/CEBInvokeHeader.java

@@ -0,0 +1,133 @@
+package com.yinjie.heating.common.entity.ceb;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.yinjie.heating.common.tool.CommonUtils;
+
+import java.util.Date;
+
+@JacksonXmlRootElement(localName = "Head")
+public class CEBInvokeHeader {
+    @JacksonXmlProperty(localName = "FTranCode")
+    private String fTranCode;
+    @JacksonXmlProperty(localName = "InstID")
+    private String instID;
+    @JacksonXmlProperty(localName = "TranDateTime")
+    private String tranDateTime;
+    @JacksonXmlProperty(localName = "BankNum")
+    private String bankNum;
+    @JacksonXmlProperty(localName = "AnsCode")
+    private String ansCode;
+
+    public CEBInvokeHeader() {
+    }
+
+    private CEBInvokeHeader(Builder builder) {
+        setfTranCode(builder.fTranCode);
+        setInstID(builder.instID);
+        setTranDateTime(builder.tranDateTime);
+        setBankNum(builder.bankNum);
+        setAnsCode(builder.ansCode);
+    }
+
+    public String getfTranCode() {
+        return fTranCode;
+    }
+
+    public void setfTranCode(String fTranCode) {
+        this.fTranCode = fTranCode;
+    }
+
+    public String getInstID() {
+        return instID;
+    }
+
+    public void setInstID(String instID) {
+        this.instID = instID;
+    }
+
+    public String getTranDateTime() {
+        return tranDateTime;
+    }
+
+    public void setTranDateTime(String tranDateTime) {
+        this.tranDateTime = tranDateTime;
+    }
+
+    public String getBankNum() {
+        return bankNum;
+    }
+
+    public void setBankNum(String bankNum) {
+        this.bankNum = bankNum;
+    }
+
+    public String getAnsCode() {
+        return ansCode;
+    }
+
+    public void setAnsCode(String ansCode) {
+        this.ansCode = ansCode;
+    }
+
+    public static CEBInvokeHeader success(CEBRequestItem reqItem) {
+        return new Builder()
+                .tranCode(reqItem.getInvokeHeader().getfTranCode())
+                .instID(reqItem.getInvokeHeader().getInstID())
+                .tranDateTime(CommonUtils.parseTimeFormat(new Date(), "yyyyMMddHHmmss"))
+                .bankNum(reqItem.getInvokeHeader().getBankNum())
+                .ansCode("AAAAAAA")
+                .build();
+    }
+
+    public static CEBInvokeHeader error(CEBRequestItem reqItem) {
+        return new Builder()
+                .tranCode(reqItem.getInvokeHeader().getfTranCode())
+                .instID(reqItem.getInvokeHeader().getInstID())
+                .tranDateTime(CommonUtils.parseTimeFormat(new Date(), "yyyyMMddHHmmss"))
+                .bankNum(reqItem.getInvokeHeader().getBankNum())
+                .ansCode("ERR000")
+                .build();
+    }
+
+
+    public static final class Builder {
+        private String fTranCode;
+        private String instID;
+        private String tranDateTime;
+        private String bankNum;
+        private String ansCode;
+
+        public Builder() {
+        }
+
+        public Builder tranCode(String val) {
+            fTranCode = val;
+            return this;
+        }
+
+        public Builder instID(String val) {
+            instID = val;
+            return this;
+        }
+
+        public Builder tranDateTime(String val) {
+            tranDateTime = val;
+            return this;
+        }
+
+        public Builder bankNum(String val) {
+            bankNum = val;
+            return this;
+        }
+
+        public Builder ansCode(String val) {
+            ansCode = val;
+            return this;
+        }
+
+        public CEBInvokeHeader build() {
+            return new CEBInvokeHeader(this);
+        }
+    }
+}

+ 32 - 0
yjCommon/src/main/java/com/yinjie/heating/common/entity/ceb/CEBRequestItem.java

@@ -0,0 +1,32 @@
+package com.yinjie.heating.common.entity.ceb;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+import java.util.Map;
+
+@JacksonXmlRootElement(localName = "In")
+public class CEBRequestItem {
+    @JacksonXmlProperty(localName = "Head")
+    private CEBInvokeHeader invokeHeader;
+
+    @JacksonXmlProperty(localName = "Body")
+    private Map<String, Object> body;
+
+
+    public CEBInvokeHeader getInvokeHeader() {
+        return invokeHeader;
+    }
+
+    public void setInvokeHeader(CEBInvokeHeader invokeHeader) {
+        this.invokeHeader = invokeHeader;
+    }
+
+    public Map<String, Object> getBody() {
+        return body;
+    }
+
+    public void setBody(Map<String, Object> body) {
+        this.body = body;
+    }
+}

+ 39 - 0
yjCommon/src/main/java/com/yinjie/heating/common/entity/ceb/CEBResponseItem.java

@@ -0,0 +1,39 @@
+package com.yinjie.heating.common.entity.ceb;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+
+import java.util.Map;
+
+@JacksonXmlRootElement(localName = "Out")
+public class CEBResponseItem {
+    @JacksonXmlProperty(localName = "Head")
+    private CEBInvokeHeader invokeHeader;
+
+    @JacksonXmlProperty(localName = "Body")
+    private Map<String, Object> body;
+
+
+    public CEBInvokeHeader getInvokeHeader() {
+        return invokeHeader;
+    }
+
+    public void setInvokeHeader(CEBInvokeHeader invokeHeader) {
+        this.invokeHeader = invokeHeader;
+    }
+
+    public Map<String, Object> getBody() {
+        return body;
+    }
+
+    public void setBody(Map<String, Object> body) {
+        this.body = body;
+    }
+
+    public String toXml(XmlMapper xmlMapper) throws JsonProcessingException {
+        return "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>" +
+                xmlMapper.writeValueAsString(this);
+    }
+}

+ 145 - 0
yjCommon/src/main/java/com/yinjie/heating/common/entity/heating/HeatingApp.java

@@ -0,0 +1,145 @@
+package com.yinjie.heating.common.entity.heating;
+
+import com.sweetfish.util.Comment;
+import com.yinjie.heating.common.entity.base.BaseEntity;
+import org.rex.db.RColumn;
+
+/**
+ * Created by jlutt on 2019-05-31.
+ * 缴费对外应用接口
+ * @author jlutt
+ */
+public class HeatingApp extends BaseEntity {
+
+  @Comment("id")
+  @RColumn("id")
+  private long id;
+
+  @Comment("appid应用id,要保证唯一")
+  @RColumn("appid")
+  private String appId;
+
+  @Comment("appid应用名称")
+  @RColumn("appname")
+  private String appName;
+
+  @Comment("应用公钥,提供给开发商,验证签名")
+  @RColumn("apppublickey")
+  private String appPublicKey;
+
+  @Comment("应用私钥,给服务商使用,发送给开发商内容进行加签")
+  @RColumn("appprivatekey")
+  private String appPrivateKey;
+
+  @Comment("开发商上传的公钥,用于服务商在开发商调用接口时验签")
+  @RColumn("supplypublickey")
+  private String supplyPublicKey;
+
+  @Comment("应用状态0正常 1禁用")
+  @RColumn("status")
+  private int status;
+
+  @Comment("收款来源 请从2开始 0现金 1支付宝已经占用,不要重复")
+  @RColumn("chargefrom")
+  private int chargeFrom;
+
+  @Comment("对应收费操作人名称")
+  @RColumn("chargeusername")
+  private String chargeUserName;
+
+  @Comment("验证方式 0密钥验证 1ip限制")
+  @RColumn("verifykind")
+  private int verifyKind;
+
+  @Comment("白名单ip,多个用逗号分隔")
+  @RColumn("whiteips")
+  private String whiteIps;
+
+  public long getId() {
+    return id;
+  }
+
+  public void setId(long id) {
+    this.id = id;
+  }
+
+  public String getAppId() {
+    return appId;
+  }
+
+  public void setAppId(String appId) {
+    this.appId = appId;
+  }
+
+  public String getAppPublicKey() {
+    return appPublicKey;
+  }
+
+  public void setAppPublicKey(String appPublicKey) {
+    this.appPublicKey = appPublicKey;
+  }
+
+  public String getAppPrivateKey() {
+    return appPrivateKey;
+  }
+
+  public void setAppPrivateKey(String appPrivateKey) {
+    this.appPrivateKey = appPrivateKey;
+  }
+
+  public String getSupplyPublicKey() {
+    return supplyPublicKey;
+  }
+
+  public void setSupplyPublicKey(String supplyPublicKey) {
+    this.supplyPublicKey = supplyPublicKey;
+  }
+
+  public String getAppName() {
+    return appName;
+  }
+
+  public void setAppName(String appName) {
+    this.appName = appName;
+  }
+
+  public int getStatus() {
+    return status;
+  }
+
+  public void setStatus(int status) {
+    this.status = status;
+  }
+
+  public int getChargeFrom() {
+    return chargeFrom;
+  }
+
+  public void setChargeFrom(int chargeFrom) {
+    this.chargeFrom = chargeFrom;
+  }
+
+  public String getChargeUserName() {
+    return chargeUserName;
+  }
+
+  public void setChargeUserName(String chargeUserName) {
+    this.chargeUserName = chargeUserName;
+  }
+
+  public int getVerifyKind() {
+    return verifyKind;
+  }
+
+  public void setVerifyKind(int verifyKind) {
+    this.verifyKind = verifyKind;
+  }
+
+  public String getWhiteIps() {
+    return whiteIps;
+  }
+
+  public void setWhiteIps(String whiteIps) {
+    this.whiteIps = whiteIps;
+  }
+}

+ 67 - 0
yjCommon/src/main/java/com/yinjie/heating/common/tool/CommonUtils.java

@@ -0,0 +1,67 @@
+package com.yinjie.heating.common.tool;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+import java.util.UUID;
+
+public class CommonUtils {
+    public static String generateRandomCode(int length) {
+        StringBuilder code = new StringBuilder();
+        Random random = new Random();
+
+        for (int i = 0; i < length; i++) {
+            int type = random.nextInt(3); // 0: 大写字母, 1: 小写字母, 2: 数字
+            switch (type) {
+                case 0:
+                    char uppercaseChar = (char) (random.nextInt(26) + 65);
+                    code.append(uppercaseChar);
+                    break;
+                case 1:
+                    char lowercaseChar = (char) (random.nextInt(26) + 97);
+                    code.append(lowercaseChar);
+                    break;
+                case 2:
+                    code.append(random.nextInt(10));
+                    break;
+            }
+        }
+
+        return code.toString();
+    }
+
+    public static String parseTimeFormat(Date date, String format) {
+        SimpleDateFormat sdf = new SimpleDateFormat(format);
+        return sdf.format(date);
+    }
+
+    /**
+     * 金额元到分
+     *
+     * @param money 原金额
+     * @return 分
+     */
+    public static long money100(BigDecimal money) {
+        return (money == null) ? 0 : money.multiply(BigDecimal.valueOf(100)).longValue();
+    }
+
+    /**
+     * 金额分转元
+     *
+     * @param fee 原金额
+     * @return 元
+     */
+    public static BigDecimal money(long fee) {
+        return BigDecimal.valueOf(fee).multiply(BigDecimal.valueOf(0.01)).setScale(2, RoundingMode.HALF_UP);
+    }
+
+    public static String generateSerialCode(){
+        String code = UUID.randomUUID().toString().replace("-", "");
+//        String nowTime = String.valueOf(new Date().getTime());
+        return code;
+    }
+
+
+}

+ 6 - 0
yjWebCore/pom.xml

@@ -17,6 +17,12 @@
             <artifactId>yjBusiness</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-xml</artifactId>
+            <version>2.17.1</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <properties>

+ 281 - 0
yjWebCore/src/main/java/com/yinjie/heating/webcore/servlet/ThirdInvokeServlet.java

@@ -0,0 +1,281 @@
+package com.yinjie.heating.webcore.servlet;
+
+import com.dySweetFishPlugin.tool.lang.DateUtil;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.sweetfish.net.http.*;
+import com.sweetfish.util.AnyValue;
+import com.sweetfish.util.AutoLoad;
+import com.yinjie.heating.common.api.HeatingDocService;
+import com.yinjie.heating.common.base.ERPAdminHttpServlet;
+import com.yinjie.heating.common.entity.ceb.CEBInvokeHeader;
+import com.yinjie.heating.common.entity.ceb.CEBRequestItem;
+import com.yinjie.heating.common.entity.ceb.CEBResponseItem;
+import com.yinjie.heating.common.entity.heating.HeatingApp;
+import com.yinjie.heating.common.tool.CommonUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * Created by jlutt on 2019-05-31.
+ *
+ * @author jlutt
+ */
+@AutoLoad(false)
+@WebServlet(name = "提供给三方的api-当前主要给光大", value = {"/invoke/*"}, comment = "应用API中心")
+public class ThirdInvokeServlet extends ERPAdminHttpServlet {
+
+    @Resource
+    HeatingDocService gasDocService;
+
+
+    private XmlMapper xmlMapper;
+
+    //光大appId,写死算了,没有这个id获取不到解密key,不解密就获取不到他传过来的appId.....
+    private static final String CEB_APP_ID = "CEB20240909";
+    private static final String CEB_SM4_KEY = "a63e5f89caed5d17b62553d0725d47da";
+
+    @Override
+    public void init(HttpContext context, AnyValue config) {
+        super.init(context, config);
+        xmlMapper = new XmlMapper();
+    }
+
+    @HttpMapping(auth = false, url = "/invoke/cebcall", methods = {"POST"}, comment = "光大银行接口")
+    public void cebCall(HttpRequest request, HttpResponse response) {
+//        logger.info(request);
+        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
+            String reqStr = request.getBody(Charset.forName("GBK"));
+            logger.info("收到光大调用消息:{}", reqStr);
+//            String reqStr = request.getBody(StandardCharsets.UTF_8); //测试
+            try {
+                Map<String, Object> respBody = new HashMap<>();
+                HeatingApp gasApp = gasDocService.getRedisGasApp(CEB_APP_ID);
+                boolean errorFlag = false;
+                if (gasApp == null) {
+                    //本地配置错误,但是也无法解密了
+                    logger.error("未找到应用APPID");
+                    return "未找到应用APPID";
+                }
+                if (gasApp.getStatus() > 0) {
+                    respBody.put("ErrorCode", "DEF0006");
+                    respBody.put("ErrorInfo", "应用APPID已禁用,请联系服务开发商");
+                    errorFlag = true;
+                }
+
+                //解密
+//                String decodeStr = SM4Utils.decryptEcb(gasApp.getAppPublicKey(), reqStr, SM4Utils.ENCODING);
+                //明文
+                String decodeStr = reqStr;
+                CEBRequestItem requestItem = xmlMapper.readValue(decodeStr, CEBRequestItem.class);
+
+                //todo 业务代码
+                if (!errorFlag) {
+                    Map<String, Object> bodyMap = requestItem.getBody();
+
+                    switch (requestItem.getInvokeHeader().getfTranCode()) {
+                        case "BJ01":
+                            respBody = queryBillsToPay(bodyMap, gasApp);
+                            break;
+                        case "BJ02":
+                            respBody = payBill(bodyMap, gasApp);
+                            break;
+                        case "BJ05":
+                            respBody = reqInvoice(bodyMap, gasApp);
+                            break;
+                    }
+                }
+
+                CEBResponseItem responseItem = new CEBResponseItem();
+                if (respBody.containsKey("ErrorCode")) {
+                    //有误
+                    responseItem.setInvokeHeader(CEBInvokeHeader.error(requestItem));
+                } else {
+                    responseItem.setInvokeHeader(CEBInvokeHeader.success(requestItem));
+                }
+                responseItem.setBody(respBody);
+                String respStr = responseItem.toXml(xmlMapper);
+
+                //加密
+//                return SM4Utils.encryptEcb(gasApp.getAppPublicKey(), respStr, SM4Utils.ENCODING);
+                //明文
+                return respStr;
+
+            } catch (Exception e) {
+                //数据格式都错了,随便返回吧
+                logger.error("请求格式有误:{}", e.getMessage(), e);
+                return "请求格式有误";
+            }
+        }, getExecutor()).whenComplete((v, e) -> {
+            if (e != null) {
+                logger.error(e.getMessage(), e);
+                response.finish("网络通信错误,请稍后重试".getBytes(Charset.forName("GBK")));
+                return;
+            }
+            response.finish(v.getBytes(Charset.forName("GBK")));
+        });
+    }
+
+    //查询待缴费
+    private Map<String, Object> queryBillsToPay(Map<String, Object> reqBody, HeatingApp gasApp) {
+        Map<String, Object> respBody = new HashMap<>();
+        if (!reqBody.containsKey("billKey")) {
+            respBody.put("ErrorCode", "DEF0010");
+            respBody.put("ErrorInfo", "用户不存在");
+            return respBody;
+        }
+
+        String billKey = reqBody.get("billKey").toString();
+        QueryOrderResult orderResult = gasFeeService.apiQueryFeeInfo(billKey);
+        if (!orderResult.getErrCode().equals("00000")) {
+            //将我们的错误代码翻译成光大的
+            switch (orderResult.getErrCode()) {
+                case "10005":
+                    respBody.put("ErrorCode", "DEF0002");
+                    respBody.put("ErrorInfo", "用户未欠费");
+                    break;
+                case "10001":
+                    respBody.put("ErrorCode", "DEF0005");
+                    respBody.put("ErrorInfo", "超过缴费时间");
+                    break;
+                case "10002":
+                    respBody.put("ErrorCode", "DEF0010");
+                    respBody.put("ErrorInfo", "用户不存在");
+                    break;
+                case "10003":
+                case "10004":
+                    respBody.put("ErrorCode", "DEF0012");
+                    respBody.put("ErrorInfo", "该用户不支持网上缴费,请联系公共事业单位");
+                    break;
+            }
+
+            return respBody;
+        } else {
+            respBody.put("companyNo", CommonUtils.generateSerialCode());
+            respBody.put("billKey", billKey);
+            respBody.put("totalNum", "1");
+
+            Map<String, Object> frame = new HashMap<>();
+            frame.put("contractNo", billKey);
+            frame.put("customerName", orderResult.getCustomerName());
+            frame.put("balance", CommonUtils.money(orderResult.getCustomerBalance()));
+            frame.put("payAmount", CommonUtils.money(orderResult.getTotalOweAmt()));
+
+            respBody.put("Frame", frame);
+        }
+        return respBody;
+    }
+
+    //缴费销账
+    private Map<String, Object> payBill(Map<String, Object> reqBody, HeatingApp gasApp) {
+        Map<String, Object> respBody = new HashMap<>();
+        if (!reqBody.containsKey("billKey")) {
+            respBody.put("ErrorCode", "DEF0010");
+            respBody.put("ErrorInfo", "用户不存在");
+            return respBody;
+        }
+
+        if (!reqBody.containsKey("payAmount")) {
+            respBody.put("ErrorCode", "DEF0013");
+            respBody.put("ErrorInfo", "金额不符合规则");
+            return respBody;
+        }
+
+        String billKey = reqBody.get("billKey").toString();
+        String payDate = reqBody.get("payDate").toString();
+        String bankBillNo = reqBody.get("bankBillNo").toString();
+        String payAmount = reqBody.get("payAmount").toString();
+
+        BigDecimal chargeMoney = new BigDecimal(payAmount);
+        if (chargeMoney.compareTo(BigDecimal.ZERO) < 1) {
+            respBody.put("ErrorCode", "DEF0013");
+            respBody.put("ErrorInfo", "金额不符合规则");
+            return respBody;
+        }
+
+        //光大要求缴费金额必须等于欠费金额
+        QueryOrderResult orderResult = gasFeeService.apiQueryFeeInfo(billKey);
+        if (!orderResult.getErrCode().equals("00000")) {
+            //将我们的错误代码翻译成光大的
+            switch (orderResult.getErrCode()) {
+                case "10005":
+                    respBody.put("ErrorCode", "DEF0002");
+                    respBody.put("ErrorInfo", "用户未欠费");
+                    break;
+                case "10001":
+                    respBody.put("ErrorCode", "DEF0005");
+                    respBody.put("ErrorInfo", "超过缴费时间");
+                    break;
+                case "10002":
+                    respBody.put("ErrorCode", "DEF0010");
+                    respBody.put("ErrorInfo", "用户不存在");
+                    break;
+                case "10003":
+                case "10004":
+                    respBody.put("ErrorCode", "DEF0012");
+                    respBody.put("ErrorInfo", "该用户不支持网上缴费,请联系公共事业单位");
+                    break;
+            }
+
+            return respBody;
+        }
+        BigDecimal debtMoney = CommonUtils.money(orderResult.getTotalOweAmt());
+
+        if (chargeMoney.compareTo(debtMoney) != 0) {
+            respBody.put("ErrorCode", "DEF0013");
+            respBody.put("ErrorInfo", "金额不符合规则");
+            return respBody;
+        }
+
+        GasPeriodCharge customerCharge = new GasPeriodCharge();
+
+        customerCharge.setCustomerId(billKey);
+        customerCharge.setChargeMoney(chargeMoney);
+        customerCharge.setBankSerial(bankBillNo);
+        customerCharge.setBankDate(DateUtil.asDate(payDate, "yyyyMMdd"));
+        customerCharge.setBankDateLong(customerCharge.getBankDate().getTime());
+        //todo 不知道写啥
+//        customerCharge.setPayMode(chargeOrder.getPayMode());
+        customerCharge.setCustomerCount(1);
+
+        ChargeOrderResult chargeResult = gasFeeService.apiChargeFee(customerCharge, gasApp);
+        if (!chargeResult.getErrCode().equals("00000")) {
+            switch (chargeResult.getErrCode()) {
+                case "00003":
+                    respBody.put("ErrorCode", "DEF0001");
+                    respBody.put("ErrorInfo", "无相应记录");
+                    break;
+                case "10001":
+                    respBody.put("ErrorCode", "DEF0005");
+                    respBody.put("ErrorInfo", "超过缴费时间");
+                    break;
+                case "10002":
+                    respBody.put("ErrorCode", "DEF0010");
+                    respBody.put("ErrorInfo", "用户不存在");
+                    break;
+                case "00002":
+                    respBody.put("ErrorCode", "DEF0006");
+                    respBody.put("ErrorInfo", "业务状态异常");
+                    break;
+            }
+            return respBody;
+        } else {
+            respBody.put("companyNo", CommonUtils.generateSerialCode());
+            respBody.put("billKey", billKey);
+            respBody.put("payAmount", payAmount);
+        }
+        return respBody;
+    }
+
+    //申请开票
+    private Map<String, Object> reqInvoice(Map<String, Object> reqBody, HeatingApp gasApp) {
+
+        return null;
+    }
+
+
+}