This commit is contained in:
Paidax
2024-07-22 17:36:03 +08:00
parent 03faa20548
commit 7e190d4ccc
24 changed files with 4001 additions and 2 deletions
+4 -2
View File
@@ -977,11 +977,13 @@ public class MainLauncher {
try {
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("com.alibaba.druid:type=MockDriver");
if (mbeanServer.isRegistered(objectName))
if (mbeanServer.isRegistered(objectName)) {
mbeanServer.unregisterMBean(objectName);
}
objectName = new ObjectName("com.alibaba.druid:type=DruidDriver");
if (mbeanServer.isRegistered(objectName))
if (mbeanServer.isRegistered(objectName)) {
mbeanServer.unregisterMBean(objectName);
}
} catch (Exception ex) {
}
}
@@ -0,0 +1,22 @@
package io.v.nutz.zhgh.memberCost.controller;
/**
* @ClassName AlipayClientConfig
* @Description TODO
* @Author zhf
* @Date 2024/1/25 15:33
*/
public interface AlipayClientConfig {
String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "2021004133670087";
String sellerId = "2088002638762620";
String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCEJBWNlUIY/2Tave1OtjTgvA21GZ5tdvZZD3jFmixIFTkEdZaRUpXCvlKuZ9heoL1IQwpbuOErJ4dM2f2Ju/Oc7QtUOjEOX6CnElR73KK5OSY8d8f5822LUOgp2zg5FHI6C7olYmjN4Nw26G6BGyqQBmWs4/sKzghKelEaH9AqkR8DZ+yOvuYtIg5KEvVixsM27TMhd6/3BuNXDIiQDVH9ZeQVb9IKuynZ6hnUJS0T4MkS41qehS1u8LgplGU5yvrNuUNeQtybADsiGHDNmNkl5lVt0QNh+N/lo56//duf5PJwh8ApDB22eXptiS6p321PSrYowy5VeFpHC07Tref9AgMBAAECggEAPQddXPKegGUT82LcgwnsCg9QVV/rp6rVw/Q9VyYJZZFHsCOO0rdNq4+zKBGWAL5ELWepFQuiEwhCmN/lFQPVU5i3LsNhfL31uLPiiQIxtVILssmvdmVTJpDLaOlyYgprZxubcUCuHsfHbSSURNSDJ9mMg/kXLLpTYfJ0Gpiuz7lkrMuAxncdz88Sp2r0O9k2T+TcnHFpRXHs+C/QAaa15EF18ieDSBLPkY0ti1R8J91LGAzDrjwcP7pNlq4u7TasZ7djv47ZFwQ3yjWoo13d9ab0MBYeQx9Grf5N+JGNf33YLyulQ0IshcuwNyB+RYhyWGjNmjnJdytzKRMOYSpPgQKBgQC6iqMPX+LGunyI+3T9l/AwAVWRJXzEHPflNxDYfQbicB5awlRixxH5T1qyZ46KZb/pBt01qDULXy0bEObVFSjAn1wXPzC9Fwb+BtVZUroYBTKV3tOAMpVCz2AAC34OZwG/3X//sRtW9Sr0Dr+yCcx8ULMiFS1BuCZfhSNXA516NQKBgQC1V+rge1pYKGnjtWqML4qJy4FEIDI4fSpGIizxumYDMxdXoUdNKoG2NHQkznHU4fIHJPVvIN/Tm82mfj2rhH9eFuu1FB8TL2soe5nPgzSJ9AmP7rZ7KBo3/SczvZqUEpii8+PjHu+Gx95BmgTzOFMnYz8xzitb4IBGTEGxVzavqQKBgCL28XFkS6FsOwOB/n+6Bu84kM1P9X7c3yo7lBC//pZa5ZWlbyPEpH3SffGKr5EJWVtYSgZQrQCgqle0Z0/xU14ngJ9q3LvUoR7kMQE5HGB8OOsWhRY2ZPvM2vWnMc2JSS6pWeCXVcSK164/RXcdlxKGHc15oq360lZ9Ig6hQtcxAoGAIYijd2V4HGtEwYXvsQKtlLOcMNPfVZDXu2Zgd0bnzFmrTFoXjE569A2ZGKFQbXRmxClydV1X5pKeIdagYtI6l1SXu8F/yZVwNGk+1R/HHGeTSRl0hyuwRYA7upaqOg2CSkfdcUdsNblKAUmQ9sUIo3T336bnX7MRJW6+iyO8ihkCgYBG8vG1fVUwPmqlRK+QanHxicR1+UyjRAN+aW6dgJUNMlC+tmPeHj21+WGkDdKPdhinHziLihLmzbmpwWSDwuGMMQPNQm8gSjiaqy1tWcP6XKDxjpG5biTzwEyHNuCIY6odS4HTeDOrrU4LvN6PxirN8xKBIpq+A2cgpGo+Mn4x+g==";
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjO/QUy+ujNBlToL6Kt8YjvTRGpEwmXjqc9pFe7GIORVkzBXP3F/UC/w5mPiwXhhyymXAe7bUwLANL/QMUZhvpjjCdLENtFWC9bd6hq3m2oHiTu0oicbzqCuaoQkzik2NybrNjuH+aYVi4RU0eNYpdewQoHHW+hbfxkSYUWmx7NF4SuG93edYlpc/G/ImdrweATLE0b6W9il4H/BxVUweCraPrispiOM8r6TN3fiIKUQRP15HKQo8Xsr4pMJzfi37I9aN8AThN/xBf6sual8IZZsH5hC3PS37LrYkXbUjt0dK5tqKl3SsZPjvvHGyz9b9JC225+0q09Y6B8/axOlihwIDAQAB";
/* String serverUrl = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";
String appId = "9021000134641646";
String privateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCBFTF8qFbK+NiqUbKf1/jWHL/s0hfUXK6cyKwZCEXkEMZH1Lu6kZQl3kQye9Fsasawxn1vLmKz+OKjMiE+TdTytHDu5ULdLlSHN3bY1qf91i8L+RJfmZpb1p+NQOk9zImhhSauuk+itMkTC3bTiwwAkg/utOxkNB7YaynpAb3evhXnlX3LUVTHaMnCQFeV7ithh7CDKx0LPlxOpOvxnkWDBR3nsdcfjDqYNDVHXnUxEk0KQV4Ik6fA40+Gq/HXTByJolCSAaTk0OaH2ULp1RZAklWLqhiNEhytTZAlJUx8cSm36mm0c4jhgSXNdRz0Yi1BlPY9yxQGStpH5ue3+EfvAgMBAAECggEAda/D4Zp9HysIJyi7SZ6XwWaO2TSnAzfI/yq6NUxkpE1i6cSbr7rgrjHaTYiz5DvpkOw3GnHZDarhvtaKlopRl0JKIJSnhI6kBG/eDE6Q9Q4c8LaSONULdaXU6+z9ehmMddW28eDtkDNxi8qM+MuyEqcYnZMYXzdh1ADIQicTXArxo+9fpvlKUMNxOTO5LoOf0DtJg/xE1CD9PtWVc+l2G8S3+C52+RhfZ214YQdxwayMlvJQlWzLTbfzJCp8w4F2up1nJdwp7EY8k8xDUngEnG6BWm8ztWUVTTg7qp/+SC9yMTD2dl86wDkJt1lTtwcKaWxHYh2ZIn8a8+icHFykaQKBgQDgBEWAmuj0pgpny5Q0GRsUYPq42SwpN70u4rmD5UYFCeDHaKb4U3kyvA1V+1Tp0XWzFi7GU855h1n8dnQX64J3Vm4GfhftWwTJgB5ibbY53cZVEoV5nZe0bOO4hxxMdNy3BKjPovkT0REPpCkVas/RRLAFCdnvi6vmDkFxvv9JewKBgQCTgx9NZZCqSzzCJYpLTDOCitooOQmR8kAlgBiDCcHeH2wNVMh5O2Dl/OyTGauKUJFWIOSD8FXVTrNUbOEmx58msnS/+Mc5SnbEka5ptVEDp73gf6ctB+eZAMdO1kLsBT3iKnuyNa7pRyR/D2A692RHOTQZIvRHE1N+kM1r+iBPHQKBgCZRVLocxUAjrp/2eJE4wiMIO5qmuyEJwbhlW6ot634tJF+3jOfpD1AYToeoh+u+wk0xvCp8Z1LuTfwbHtyAkj5rcEJ4Cwu0h+sXmRro/USEpMokcuRMioh4H7OOmM6TJrW/fEiX7dbv6eUtBUH+lTGMeDdEahzJXUvqoFMegnhFAoGAa2eflRUMflIFzT7UMPsszjIXog3VoASJHETmlBK4q+ipHhPLXCoV5Z+BCaI5Op5rFBEjEcYeWQ/Slvgn/7p9cQmi5FxZgqdrTrjcC2/Pqx+pqxqHOMx2nvroI8jyNTOj2VchdaKM1qHMOw+Q+55Bz3IhMuQ2hMHXm2IHkEUw3SkCgYBjcqcWbJcq26L8yYVpU2JFzOvu7iHuV99TpEvF9Ym3cAcSNuoR5kGXzGS0MadYY87cd4HK9HvmXQmthLY14buKYxq27ZFfNbK/Auz8vk0Wbrm1Ym4Z1yMqClQqxKdr4hV29ijn1nPProRqgnVsGH3EtFmNxDfilZoVzh9ERaZe7w==";
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArhElUiFMpxqFCs+8zDHa4OVuhdWgKUUGVKgWnfLktPgy9mDZkuGPKk295k8ktWQSUZsnFvT8ikJIKdGYfbSWzlXvCAn6lDDDlsjfOJWMQ6zLmb9xygCih2OjwN5xt9QFIIthnWq8sOXpWvqmoRpIFQHolxxmvvCmUZ/VwK6mwgwU/yVvVypruQ/FGrJA70LAcJ764spWAMy/pWIoIs5UewOlJa3TAcZQIqRnjupL2/sI/TpIWFWF90a/rahwLfBgZ83VH7MA4Tl9uFLc3aeNFLllDF4X7lRdzaHIMYgUUKte9yvlDy5Ihrt+ssjsgdRhqLHvFn00u/g7BCvO5ZmIUwIDAQAB";
*/
}
@@ -0,0 +1,68 @@
package io.v.nutz.zhgh.memberCost.controller;
import io.v.nutz.zhgh.memberCost.service.AlipayService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @ClassName AlipayClientController
* @Description TODO
* @Author zhf
* @Date 2024/1/25 15:36
*/
@IocBean
@Slf4j
@Ok("json:full")
@At("/mobile/memberCost/AlipayClient")
public class AlipayClientController {
@Inject
private AlipayService alipayService;
@At("/tradePagePay")
public String tradePagePay(String money, String paymentProjectId) throws Exception {
log.info("统一收单下单并支付接口调用");
String formStr = alipayService.tradeCreate(money, paymentProjectId);
return formStr;
}
@At("/tradeNotify")
@Ok("re")
public String tradeNotify(HttpServletRequest request) {
try {
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
log.info("支付通知,正在执行,通知参数:{}");
return alipayService.tradeNotify(params);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
@@ -0,0 +1,69 @@
package io.v.nutz.zhgh.memberCost.controller.mobile;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @ClassName MobileMemberCostListController
* @Description TODO
* @Author zhf
* @Date 2024/1/26 15:37
*/
@IocBean
@Slf4j
@Ok("json:full")
@At("/mobile/memberCost/list")
public class MobileMemberCostListController {
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/mobile/memberCost/memberCostList.html")
public void index() {
}
@At("/paySuccess")
@Ok("beetl:/mobile/memberCost/paySuccess.html")
public void paySuccess() {
}
@At
@ViReturn
public Object pageData(Integer memberActive) {
Sql sql = Sqls.create("""
SELECT
mpi.*,
mpp.modeValue,
mpp.modeValueList,
mpp.selectMode,
mpp.projectName
FROM
member_payment_info mpi
LEFT JOIN member_payment_project mpp ON mpi.paymentProjectId = mpp.id
WHERE
mpi.userId = @userId
AND mpp.isDisabled =0
and mpi.isPayment =@isPayment
""").setParam("userId", ShiroUtil.getUserId()).setParam("isPayment", memberActive);
return memberPaymentService.listMap(sql);
}
@At
@ViReturn
public Object getPayInfo(String id) {
return memberPaymentService.fetch(id);
}
}
@@ -0,0 +1,44 @@
package io.v.nutz.zhgh.memberCost.controller.payment;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@Slf4j
@Ok("json:full")
@At("/platform/member/payment/config")
public class MemberPaymentConfigController {
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/platform/memberCost/payment/config.html")
@RequiresPermissions("member.payment.config")
public void index() {}
@At
@ViReturn
public Object getPaymentConfig(){
return memberPaymentService.getConfig();
}
@At
@ViReturn
@RequiresPermissions("member.payment.config")
public Object doAddOrModify(MemberPaymentConfig memberPaymentConfig){
System.out.println(memberPaymentConfig);
memberPaymentService.dao().insertOrUpdate(memberPaymentConfig);
return null;
}
}
@@ -0,0 +1,261 @@
package io.v.nutz.zhgh.memberCost.controller.payment;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.result.Result;
import io.v.nutz.sys.models.Sys_user;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.impl.NutTxDao;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@IocBean
@Slf4j
@Ok("json:full")
@At("/platform/member/payment/manage")
public class MemberPaymentManageController {
@Inject
private MemberPaymentService memberPaymentService;
@At("")
@Ok("beetl:/platform/memberCost/payment/manage.html")
@RequiresPermissions("member.payment.manage")
public void index() {
}
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object pageData(PageForm pageForm,
@Param(value = "year", required = false) String year,
@Param(value = "projectName", required = false) String projectName) {
Sql sql = Sqls.create("select project.*,IF((SELECT count(1) FROM member_payment_info WHERE paymentProjectId = project.id)>0,TRUE,FALSE) created from member_payment_project project $condition");
CndPlus cnd = CndPlus.create();
cnd.andEX("project.`year`", "=", year);
if (Strings.isNotBlank(projectName)) {
cnd.and(Cnd.likeEX("project.projectName", projectName));
}
// cnd.desc("project.`year`");
cnd.desc("project.createTime");
sql.setCondition(cnd);
return memberPaymentService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 是否开启
*
* @param id 项目Id
* @return
*/
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object openClosedProject(String id) {
//位运算 取反
memberPaymentService.dao().update(MemberPaymentProject.class,
Chain.makeSpecial("isDisabled", "isDisabled ^ 1"),
Cnd.where("id", "=", id));
return null;
}
/**
* 添加或修改缴费项目
*
* @param paymentProject
* @return
*/
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object doSave(MemberPaymentProject paymentProject) {
memberPaymentService.insertOrUpdate(paymentProject);
return null;
}
/**
* 设置缴费人员
*
* @param id 缴费项目Id
* @param isRenew 是否更行缴费人员
* @return
*/
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object doSetPayment(String id, Boolean isRenew) {
//如果不是更新缴费人员,就删除该项目下的所有待缴费信息,再重新设置
if (!isRenew) {
memberPaymentService.clear(Cnd.where("paymentProjectId", "=", id));
}
//获取缴费配置
MemberPaymentConfig config = memberPaymentService.getConfig();
List<MemberPaymentConfig.PayStandards> payStandards = config.getPayStandards();
//缴费人员类型
List<String> personTypeList = new ArrayList<>();
payStandards.forEach(v->{
personTypeList.addAll(v.getPersonTypes());
});
//获取所有有入会时间的会员
List<Sys_user> memberList = memberPaymentService.dao().query(Sys_user.class, Cnd.where("member", "=", 1).and("memberJoinTime","is not",null).and("personType","in",personTypeList));
//获取该项目下的代缴人员
List<String> paymentUserIdList = memberPaymentService.query(Cnd.where("paymentProjectId", "=", id)).stream().map(MemberPaymentInfo::getUserId).collect(Collectors.toList());
//过滤出需要新增到记录表中的人员
List<Sys_user> needInsertUserIds = memberList.stream().filter(v -> !paymentUserIdList.contains(v.getId())).collect(Collectors.toList());
//获取缴费项目
MemberPaymentProject project = memberPaymentService.dao().fetch(MemberPaymentProject.class, id);
//该项目的缴费月份是几月到几月,转为数组,判断新入职教工应缴费几个月
String[] strings = project.getPaymentMonth().substring(0, project.getPaymentMonth().length() - 1).split("-");
DateTime beginDate = DateUtil.parse(project.getYear() + "-" + strings[0] + "-01");
//获取月份的最后一天
DateTime endDate = DateUtil.endOfMonth(DateUtil.parse(project.getYear() + "-" + strings[1] + "-01"));
List<MemberPaymentInfo> memberPaymentInfos = new ArrayList<>();
needInsertUserIds.forEach(v -> {
MemberPaymentInfo paymentInfo = new MemberPaymentInfo();
//如果是新入职教工,计算需要缴纳的月数
if (v.getMemberJoinTime().after(beginDate) && v.getMemberJoinTime().before(endDate)){
long differMonth = DateUtil.betweenMonth(v.getMemberJoinTime(), endDate, false);
paymentInfo.setPaymentMonth(String.valueOf(differMonth));
} else {
paymentInfo.setPaymentMonth(config.getPaidDuration());
}
paymentInfo.setUserId(v.getId());
paymentInfo.setLoginname(v.getLoginname());
paymentInfo.setPaymentProjectId(id);
paymentInfo.setPayment(false);
memberPaymentInfos.add(paymentInfo);
});
if (memberPaymentInfos.size() < 500) {
memberPaymentService.insert(memberPaymentInfos);
} else {
List<List<MemberPaymentInfo>> splitList = CollectionUtil.split(memberPaymentInfos, 500);
NutTxDao nutTxDao = new NutTxDao(memberPaymentService.dao()).setDebug(true);
nutTxDao.beginRC();
ExecutorService executorService = Executors.newWorkStealingPool();
List<Callable<Object>> taskList = new ArrayList<>();
for (List<MemberPaymentInfo> everyList : splitList) {
taskList.add(() -> nutTxDao.insert(everyList).size());
}
List<Future<Object>> futureList = null;
AtomicInteger atomicInteger = new AtomicInteger();
try {
futureList = executorService.invokeAll(taskList);
for (Future<Object> future : futureList) {
atomicInteger.getAndAdd((Integer) future.get());
}
if (atomicInteger.get() != memberPaymentInfos.size()) {
throw new RuntimeException("插入数据与期望数据条数不符");
}
nutTxDao.commit();
} catch (Exception e) {
nutTxDao.rollback();
throw new RuntimeException(e);
} finally {
executorService.shutdown();
}
}
return null;
}
/**
* 删除
*
* @param id 项目Id
* @return
*/
@At
@RequiresPermissions("member.payment.manage")
@Aop(TransAop.READ_COMMITTED)
public Object doRemove(String id) {
int paymentCount = memberPaymentService.count(Cnd.where("paymentProjectId", "=", id).and("isPayment", "=", 1));
if (paymentCount > 0) {
return Result.error().addMsg("该项目已有人完成缴费,请将缴费人员设置为未缴后再进行删除!");
}
memberPaymentService.dao().clear(MemberPaymentProject.class, Cnd.where("id", "=", id));
memberPaymentService.clear(Cnd.where("paymentProjectId", "=", id));
return Result.success();
}
/**
* 获取全部缴费项目
*
* @param year
* @return
*/
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object getAllProject(String year) {
CndPlus cnd = CndPlus.create();
cnd.and("isDisabled", "=", 0);
if (Strings.isNotBlank(year)) {
cnd.and("`year`", "=", year);
}
cnd.desc("createTime");
cnd.desc("year");
return memberPaymentService.dao().query(MemberPaymentProject.class, cnd);
}
@At("/findOne")
@ViReturn
public Object findOne(String id) {
return memberPaymentService.findOneProject(id);
}
@At
@ViReturn
@RequiresPermissions("member.payment.manage")
public Object isMonthCreatedByYear(@Param("year") String year, @Param("monthSelect") String monthSelect, @Param("id") String projectId) {
List<NutMap> nutMapList = Json.fromJsonAsList(NutMap.class, monthSelect);
for (NutMap nutMap : nutMapList) {
int count = memberPaymentService.dao().count(MemberPaymentProject.class, Cnd.where("`year`", "=", year).and("paymentMonth", "=", nutMap.getString("label")));
nutMap.setv("code", count > 0 ? 1 : 0);
}
return nutMapList;
}
}
@@ -0,0 +1,338 @@
package io.v.nutz.zhgh.memberCost.controller.payment;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.hutool.core.util.StrUtil;
import io.v.nutz.base.annontation.ViReturn;
import io.v.nutz.base.dao.CndPlus;
import io.v.nutz.base.query.PageForm;
import io.v.nutz.base.result.Result;
import io.v.nutz.base.utils.MsgApi;
import io.v.nutz.base.utils.Vi;
import io.v.nutz.base.utils.ViTool;
import io.v.nutz.sys.models.Sys_union;
import io.v.nutz.sys.services.SysUserService;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import io.v.nutz.zhgh.memberCost.template.MemberPaymentTemp;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@IocBean
@Slf4j
@Ok("json:full")
@At("/platform/member/payment/summary")
public class MemberPaymentSummaryController {
@Inject
private MemberPaymentService memberPaymentService;
@Inject
private SysUserService sysUserService;
@Inject
private MsgApi msgApi;
@At("")
@Ok("beetl:/platform/memberCost/payment/summary.html")
@RequiresPermissions("member.payment.summary")
public void index() {
}
public Sql dataSql(String pageOrderName, String pageOrderBy, String searchName, String searchKeyword,
String unionId, String unitId, String threeUnitId, String unionGroupId,
String personType, String userState, String paymentProjectId, String year,
String isPay) {
Sql sql = Sqls.create("""
SELECT
mpi.*,
IF(mpi.isPayment = 1,'已缴费','未缴费') AS isPay,
mpp.projectName,
u.username,
u.sex,
u.member,
u.welfareMember,
u.personType,
u.userState,
u.unionname,
u.unionid,
u.unitname,
u.unitid,
u.threeUnitName,
u.threeUnitCode,
u.unionGroupName,
u.mobile,
u.birthday
FROM
`member_payment_info` mpi
LEFT JOIN `user` u ON u.id = mpi.userId
left join `member_payment_project` mpp on mpp.id = mpi.paymentProjectId
$condition
""");
CndPlus cnd = CndPlus.create();
if (StrUtil.isNotBlank(searchName) && StrUtil.isNotBlank(searchKeyword)) {
cnd.and(Cnd.likeEX(searchName, searchKeyword));
}
if (!ShiroUtil.hasAnyRoles("sysadmin,A06,H03")) {
if (ShiroUtil.hasRole("H04")) {
cnd.and("u.unionid", "=", Vi.getUnionId());
} else {
cnd.and("u.unionGroupId", "in", io.v.nutz.web.commons.utils.ShiroUtil.getUnionGroupIds());
}
}
cnd.andEX("mpp.`year`", "=", year);
cnd.andEX("mpi.paymentProjectId", "=", paymentProjectId);
if (Strings.isNotBlank(isPay) && !"null".equals(isPay)) {
cnd.andEX("mpi.isPayment", "=", "true".equals(isPay) ? 1 : 0);
}
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitid", "=", unitId);
cnd.andEX("u.threeUnitId", "=", threeUnitId);
cnd.andEX("u.unionGroupId", "=", unionGroupId);
cnd.andEX("u.personType", "=", personType);
cnd.andEX("u.userState", "=", userState);
cnd.groupBy("u.id");
if (StrUtil.isNotBlank(pageOrderName) && StrUtil.isNotBlank(pageOrderBy)) {
cnd.orderBy(pageOrderName, pageOrderBy.equalsIgnoreCase("ascending") ? "ASC" : "DESC");
} else {
cnd.desc("mpi.isPayment");
cnd.desc("mpi.paymentTime");
cnd.asc("u.loginname");
}
sql.setCondition(cnd);
return sql;
}
@At
@ViReturn
@RequiresPermissions("member.payment.summary")
public Object pageData(PageForm pageForm,
@Param(value = "unionId", required = false) String unionId,
@Param(value = "unitId", required = false) String unitId,
@Param(value = "unionGroupId", required = false) String unionGroupId,
@Param(value = "threeUnitId", required = false) String threeUnitId,
@Param(value = "personType", required = false) String personType,
@Param(value = "userState", required = false) String userState,
@Param(value = "paymentProjectId", required = false) String paymentProjectId,
@Param(value = "year", required = false) String year,
@Param(value = "isPay", required = false) String isPay) {
Sql sql = this.dataSql(pageForm.getPageOrderName(), pageForm.getPageOrderBy(), pageForm.getSearchName(),
pageForm.getSearchKeyword(), unionId, unitId, threeUnitId, unionGroupId,
personType, userState, paymentProjectId, year, isPay);
return memberPaymentService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@At
@ViReturn
@RequiresPermissions("member.payment.summary")
public Object modify(@Param("ids") String[] ids, String paymentMoney, boolean isPay, String remark) {
List<String> idList = Arrays.asList(ids);
if (Lang.isNotEmpty(idList)) {
if (isPay) {
//未缴费设为已缴费
memberPaymentService.update(Chain.make("paymentMoney", paymentMoney)
.add("remark", remark).add("isPayment", 1)
.add("paymentTime", new Date()),
Cnd.where("id", "in", idList));
} else {
//已缴费设为未缴费
memberPaymentService.update(Chain.make("paymentMoney", null)
.add("isPayment", 0).add("paymentTime", null),
Cnd.where("id", "in", idList));
}
}
return null;
}
@At
@ViReturn
@RequiresPermissions("member.payment.summary")
public Object doRemoveById(String id) {
memberPaymentService.delete(id);
return null;
}
@At
@Ok("void")
@RequiresPermissions("member.payment.summary")
public void downloadImportTemp(HttpServletResponse response) {
try {
ViTool.excelResponse(response, "会员缴费导入模版.xlsx");
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook sheets = ExcelExportUtil.exportExcel(exportParams, MemberPaymentTemp.class, new ArrayList<>());
ServletOutputStream outputStream = response.getOutputStream();
sheets.write(outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@RequiresPermissions("member.payment.summary")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Object doImport(TempFile file, String projectId) {
try {
List<MemberPaymentTemp> memberPaymentTempList = ExcelImportUtil.importExcel(file.getFile(), MemberPaymentTemp.class, new ImportParams());
List<MemberPaymentInfo> paymentUserList = memberPaymentService.query(Cnd.where("paymentProjectId", "=", projectId));
Map<String, MemberPaymentInfo> infoMap = paymentUserList.stream().collect(Collectors.toMap(MemberPaymentInfo::getLoginname, v -> v));
List<MemberPaymentTemp> errorInfos = new ArrayList<>();
List<MemberPaymentInfo> needInsertList = new ArrayList<>();
//缴费比例
BigDecimal paymentProportion = new BigDecimal("0.005");
memberPaymentTempList.forEach(v -> {
if (infoMap.containsKey(v.getLoginname().trim())) {
if (Strings.isNotBlank(v.getPaymentBaseOne()) && Strings.isNotBlank(v.getPaymentBaseTwo())) {
MemberPaymentInfo memberPaymentInfo = infoMap.get(v.getLoginname().trim());
memberPaymentInfo.setPayment(true);
memberPaymentInfo.setPaymentBaseOne(v.getPaymentBaseOne());
memberPaymentInfo.setPaymentBaseTwo(v.getPaymentBaseTwo());
//缴费金额,精度计算
DecimalFormat df = new DecimalFormat("#0.000");
BigDecimal baseOne = new BigDecimal(v.getPaymentBaseOne());
BigDecimal baseTwo = new BigDecimal(v.getPaymentBaseTwo());
String paymentMoney = df.format((baseOne.add(baseTwo)).multiply(paymentProportion));
memberPaymentInfo.setPaymentMoney(paymentMoney);
// memberPaymentInfo.setPaymentTime(v.getPaymentTime() != null ? v.getPaymentTime() : new Date());
memberPaymentInfo.setRemark(v.getRemark());
memberPaymentInfo.setPaymentMethod("导入");
needInsertList.add(memberPaymentInfo);
} else {
v.setResult("请填写该教职工的缴费数据!");
errorInfos.add(v);
}
} else {
v.setResult("该教工可能不在此次缴费项目之中,请重新设置缴费人员或检查人员是否正确!");
errorInfos.add(v);
}
});
int i = 0;
if (Lang.isNotEmpty(needInsertList)) {
i = memberPaymentService.updateIgnoreNull(needInsertList);
}
if (Lang.isNotEmpty(errorInfos)) {
NutMap nutMap = NutMap.NEW();
nutMap.setv("totalCount", memberPaymentTempList.size());
nutMap.setv("successCount", i);
nutMap.setv("errorCount", errorInfos.size());
nutMap.setv("errorList", errorInfos.stream().map(v -> {
return NutMap.NEW().addv("工号", v.getLoginname()).addv("姓名", v.getUsername()).addv("错误原因", v.getResult());
}).collect(Collectors.toList()));
return Result.success(nutMap);
}
return Result.success();
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
@At
@Ok("void")
@RequiresPermissions("member.payment.summary")
public void doExport(@Param(value = "searchName", required = false) String searchName,
@Param(value = "searchKeyword", required = false) String searchKeyword,
@Param(value = "unionId", required = false) String unionId,
@Param(value = "unitId", required = false) String unitId,
@Param(value = "unionGroupId", required = false) String unionGroupId,
@Param(value = "threeUnitId", required = false) String threeUnitId,
@Param(value = "personType", required = false) String personType,
@Param(value = "userState", required = false) String userState,
@Param(value = "paymentProjectId", required = false) String paymentProjectId,
@Param(value = "year", required = false) String year,
@Param(value = "isPay", required = false) String isPay,
boolean isZip, HttpServletResponse response) {
Sql sql = this.dataSql(null, null, searchName, searchKeyword, unionId, unitId, threeUnitId,
unionGroupId, personType, userState, paymentProjectId, year, isPay);
List<NutMap> list = memberPaymentService.listMap(sql);
NutMap nutMap = list.stream().findFirst().orElse(null);
List<Sys_union> unionIdList = memberPaymentService.dao().query(Sys_union.class, Cnd.NEW());
try {
assert nutMap != null;
if (isZip) {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(nutMap.getString("projectName") + "缴费详情.zip", "UTF-8"));
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (Sys_union union : unionIdList) {
String fileName = union.getUnioncode() + union.getUnionname().replaceAll("/", "、") + "缴费记录表.xlsx";
zipOutputStream.putNextEntry(new ZipEntry(fileName));
List<NutMap> unionUserList = list.stream().filter(v -> Strings.isNotBlank(v.getString("unionid")) && v.getString("unionid").equals(union.getId())).collect(Collectors.toList());
Workbook workbook = memberPaymentService.exportOrZip(unionUserList, response.getOutputStream());
workbook.write(zipOutputStream);
zipOutputStream.closeEntry();
response.flushBuffer();
}
zipOutputStream.flush();
zipOutputStream.close();
} else {
ViTool.excelResponse(response, nutMap.getString("projectName") + "缴费详情表.xlsx");
Workbook workbook = memberPaymentService.exportOrZip(list, response.getOutputStream());
workbook.write(response.getOutputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@ViReturn
@RequiresPermissions("member.payment.summary")
public Object sendPaymentMsg(@Param(value = "id", required = false) String id) {
if (Strings.isNotBlank(id)) {
List<MemberPaymentInfo> paymentInfos = memberPaymentService.query(Cnd.where("isPayment", "=", 0));
// msgApi.sendMsg();
} else {
MemberPaymentInfo paymentInfo = memberPaymentService.fetch(id);
// msgApi.sendMsg();
}
return null;
}
}
@@ -0,0 +1,51 @@
package io.v.nutz.zhgh.memberCost.model;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.io.Serializable;
import java.util.List;
@Data
@Table
public class MemberPaymentConfig {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("缴费标准")
@ColDefine(type = ColType.MYSQL_JSON)
private List<PayStandards> payStandards;
@Column
@Comment("未缴费退会时长")
@ColDefine(type = ColType.VARCHAR,width = 10)
private String unPaidExitDuration;
@Column
@Comment("退会模式(1,。自动退会;2.人工退会)")
@ColDefine(type = ColType.VARCHAR,width = 10)
private String exitMode;
@Column
@Comment("缴费时长(多久缴费一次)")
@ColDefine(type = ColType.VARCHAR,width = 10)
private String paidDuration;
@Data
public static class PayStandards implements Serializable {
private String payPersonnel;
private String payMode;
private List<String> personTypes;
private String payModeValue;
private List<NutMap> payModeValueList;
}
}
@@ -0,0 +1,90 @@
package io.v.nutz.zhgh.memberCost.model;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@Data
@Table
public class MemberPaymentInfo {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("用户id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("工号")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String loginname;
@Column
@Comment("缴费项目id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String paymentProjectId;
@Column
@Comment("工资")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String wages;
@Column
@Comment("是否缴费")
@ColDefine(type = ColType.BOOLEAN)
private boolean isPayment;
@Column
@Comment("缴费基数1")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String paymentBaseOne;
@Column
@Comment("缴费基数2")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String paymentBaseTwo;
@Column
@Comment("缴费金额")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String paymentMoney;
@Column
@Comment("缴费日期")
@ColDefine(type = ColType.DATETIME)
private Date paymentTime;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String remark;
@Column
@Comment("支付记录Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String payId;
@Column
@Comment("支付宝记录Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String tradeNo;
@Column
@Comment("缴费方式")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String paymentMethod;
@Column
@Comment("缴费月份")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String paymentMonth;
}
@@ -0,0 +1,45 @@
package io.v.nutz.zhgh.memberCost.model;
import lombok.Data;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@Data
@Table
public class MemberPaymentProject {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("年度")
@ColDefine(type = ColType.VARCHAR, width = 4)
private String year;
@Column
@Comment("项目名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String projectName;
@Column
@Comment("是否开启")
@ColDefine(type = ColType.BOOLEAN)
private boolean isDisabled;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.DATETIME)
private Date createTime;
@Column
@Comment("缴费月份")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String paymentMonth;
}
@@ -0,0 +1,15 @@
package io.v.nutz.zhgh.memberCost.service;
import io.v.nutz.base.service.ViService;
import java.util.Map;
public interface AlipayService extends ViService {
/**
* 支付宝开放平台接收 request请求对象后
* @return
*/
String tradeCreate( String money, String paymentProjectId) throws Exception;
String tradeNotify(Map<String, String> params) ;
}
@@ -0,0 +1,20 @@
package io.v.nutz.zhgh.memberCost.service;
import io.v.nutz.base.service.ViService;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.lang.util.NutMap;
import java.io.OutputStream;
import java.util.List;
public interface MemberPaymentService extends ViService<MemberPaymentInfo> {
MemberPaymentProject findOneProject(String id);
Workbook exportOrZip(List<NutMap> list, OutputStream outputStream)throws Exception;
MemberPaymentConfig getConfig();
}
@@ -0,0 +1,140 @@
package io.v.nutz.zhgh.memberCost.service.impl;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConstants;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.web.commons.utils.ShiroUtil;
import io.v.nutz.zhgh.memberCost.controller.AlipayClientConfig;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import io.v.nutz.zhgh.memberCost.service.AlipayService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import java.util.Date;
import java.util.Map;
/**
* @ClassName AlipayNewServiceImpl
* @Description TODO
* @Author zhf
* @Date 2024/1/25 15:38
*/
@Slf4j
@IocBean(args = {"refer:dao"})
public class AlipayNewServiceImpl extends ViServiceImpl implements AlipayService {
public AlipayNewServiceImpl(Dao dao) {
super(dao);
}
DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayClientConfig.serverUrl,
AlipayClientConfig.appId,
AlipayClientConfig.privateKey,
AlipayConstants.FORMAT_JSON,
AlipayConstants.CHARSET_UTF8,
AlipayClientConfig.alipayPublicKey,
AlipayConstants.SIGN_TYPE_RSA2);
@Override
public String tradeCreate(String money, String paymentProjectId) throws Exception {
String outTradeNo = String.valueOf(new Date().getTime());
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
//支付宝公共参数
request.setReturnUrl("http://sansi.ltd/mobile/memberCost/AlipayClient/tradeNotify");
//面向对象封装业务参数
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setOutTradeNo(outTradeNo);
model.setTotalAmount(money);
model.setSubject("会员入会会费");
model.setProductCode("QUICK_WAP_WAY");
model.setSellerId(AlipayClientConfig.sellerId);
model.setTimeoutExpress("30m");
model.setQuitUrl("http://sansi.ltd/mobile/memberCost/list");
request.setBizModel(model);
//执行请求,调用支付宝
AlipayTradeWapPayResponse response = alipayClient.pageExecute(request, "POST");
if (response.isSuccess()) {
dao().update(MemberPaymentInfo.class, Chain.make("payId", outTradeNo), Cnd.where("paymentProjectId", "=", paymentProjectId)
.and("userId", "=", ShiroUtil.getUserId()));
log.info("调用成功,返回结果:[{}]", response.getBody());
return response.getBody();
} else {
log.info("调用失败!!");
}
return null;
}
@Override
public String tradeNotify(Map<String, String> params) {
String total_amount = params.get("total_amount");
String out_trade_no = params.get("out_trade_no");
String trade_no = params.get("trade_no");
//
String result = "failure";
try {
//异步通知验签
boolean signVerified = AlipaySignature.rsaCheckV1(params,
AlipayClientConfig.alipayPublicKey,
AlipayConstants.CHARSET_UTF8,
AlipayConstants.SIGN_TYPE_RSA2);
if (!signVerified) {
// TODO 验签失败则记录异常日志,并在response中返回failure.
log.error("支付成功,异步通知验签失败!");
return result;
}
log.info("支付成功,异步通知验签成功!");
//TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验
//1.验证out_trade_no 是否为商家系统中创建的订单号
String outTradeNo = params.get("out_trade_no");
if (!outTradeNo.equals(out_trade_no)) {
log.error("订单号不一致");
return result;
}
//2.判断 total_amount 是否确实为该订单的实际金额
String totalAmount = params.get("total_amount");
if (!totalAmount.equals(total_amount)) {
log.error("订单的实际金额不一致");
return result;
}
//3.校验通知中的 seller_id是否为 out_trade_no 这笔单据的对应的操作方
String sellerId = params.get("seller_id");
if (!sellerId.equals(AlipayClientConfig.sellerId)) {
log.error("商家PID校验失败");
return result;
}
//4.验证 app_id 是否为该商家本身
String appId = params.get("app_id");
if (!appId.equals(AlipayClientConfig.appId)) {
log.error("app_id校验失败");
return result;
}
dao().update(MemberPaymentInfo.class,
Chain.make("isPayment", true)
.add("paymentMoney", total_amount)
.add("paymentTime", new Date())
.add("tradeNo", trade_no),
Cnd.where("userId", "=", ShiroUtil.getUserId()).and("payId", "=", out_trade_no));
//TODO 处理自身业务
result = "->:/mobile/memberCost/list/paySuccess";
} catch (AlipayApiException e) {
e.printStackTrace();
}
return result;
}
}
@@ -0,0 +1,64 @@
package io.v.nutz.zhgh.memberCost.service.impl;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import io.v.nutz.base.service.impl.ViServiceImpl;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentConfig;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentInfo;
import io.v.nutz.zhgh.memberCost.model.MemberPaymentProject;
import io.v.nutz.zhgh.memberCost.service.MemberPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@IocBean(args = {"refer:dao"})
public class MemberPaymentServiceImpl extends ViServiceImpl<MemberPaymentInfo> implements MemberPaymentService {
public MemberPaymentServiceImpl(Dao dao) {
super(dao);
}
@Override
public MemberPaymentProject findOneProject(String id) {
return dao().fetch(MemberPaymentProject.class, id);
}
@Override
public Workbook exportOrZip(List<NutMap> list, OutputStream outputStream) throws Exception {
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("工号", "loginname", 20));
exportEntities.add(new ExcelExportEntity("姓名", "username", 20));
// exportEntities.add(new ExcelExportEntity("年度", "year", 20));
exportEntities.add(new ExcelExportEntity("缴费项目", "projectName", 20));
exportEntities.add(new ExcelExportEntity("性别", "sex", 20));
exportEntities.add(new ExcelExportEntity("联系电话", "mobile", 20));
// exportEntities.add(new ExcelExportEntity("身份证号", "idcard", 30));
exportEntities.add(new ExcelExportEntity("在职状态", "userState", 20));
exportEntities.add(new ExcelExportEntity("人员类型", "personType", 20));
exportEntities.add(new ExcelExportEntity("所属工会", "unionname", 20));
exportEntities.add(new ExcelExportEntity("所属单位", "unitname", 30));
exportEntities.add(new ExcelExportEntity("是否缴费", "isPay", 10));
exportEntities.add(new ExcelExportEntity("缴费金额", "paymentMoney", 10));
exportEntities.add(new ExcelExportEntity("缴费时间", "paymentTime", 20));
exportEntities.add(new ExcelExportEntity("备注", "remark", 30));
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
exportParams.setHeight((short) 10);
return ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
}
@Override
public MemberPaymentConfig getConfig() {
return dao().fetch(MemberPaymentConfig.class);
}
}
@@ -0,0 +1,31 @@
package io.v.nutz.zhgh.memberCost.template;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
@Data
public class MemberPaymentTemp {
@Excel(name = "工号")
String loginname;
@Excel(name = "姓名")
String username;
@Excel(name = "缴纳基数1")
String paymentBaseOne;
@Excel(name = "缴纳基数2")
String paymentBaseTwo;
// @Excel(name = "缴费金额")
// String paymentMoney;
//
// @Excel(name = "缴费日期")
// Date paymentTime;
@Excel(name = "备注")
String remark;
String result;
}