This commit is contained in:
Paidax
2025-07-31 15:48:46 +08:00
parent ac02be1aec
commit 1510e28ab0
294 changed files with 36042 additions and 4361 deletions
@@ -25,6 +25,7 @@ public enum BpmProcessConstant {
GRASSROOTS_CONGRESS_MATERIALS("基层双代会会议资料"),
MEMBER_SINGLE_APPLY("会员入会申请"),
MEMBER_CHANGE("会员入会申请"),
MEMBER_BRANCH_UNION_CHANGE("会员分工会变更"),
@@ -20,6 +20,9 @@ public class RedisConstant {
//企业微信token
public final static String REDIS_KEY_WX_WORK_TOKEN = PLATFORM_REDIS_PREFIX + "wxwork:token:";
//健步走小程序TOKEN
public final static String REDIS_KEY_WE_APP_ACCESS_TOKEN = PLATFORM_REDIS_PREFIX + "weapp:token:";
//图形验证码
public final static String REDIS_CAPTCHA_KEY = PLATFORM_REDIS_PREFIX + "platfrom:captcha:";
@@ -0,0 +1,68 @@
package com.budwk.app.base.payment.alipay.controller;
import com.budwk.app.base.payment.alipay.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,22 @@
package com.budwk.app.base.payment.alipay.service;
/**
* @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,15 @@
package com.budwk.app.base.payment.alipay.service;
import com.budwk.app.base.service.BaseService;
import java.util.Map;
public interface AlipayService extends BaseService {
/**
* 支付宝开放平台接收 request请求对象后
* @return
*/
String tradeCreate( String money, String paymentProjectId) throws Exception;
String tradeNotify(Map<String, String> params) ;
}
@@ -0,0 +1,140 @@
package com.budwk.app.base.payment.alipay.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 com.budwk.app.base.payment.alipay.service.AlipayClientConfig;
import com.budwk.app.base.payment.alipay.service.AlipayService;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.memberCost.model.MemberPaymentInfo;
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 BaseServiceImpl 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", "=", SecurityUtil.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", "=", SecurityUtil.getUserId()).and("payId", "=", out_trade_no));
//TODO 处理自身业务
result = "->:/mobile/memberCost/list/paySuccess";
} catch (AlipayApiException e) {
e.printStackTrace();
}
return result;
}
}
@@ -0,0 +1,24 @@
package com.budwk.app.base.payment.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 退款状态枚举
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "RefundStateEnum", name = "退款状态枚举")
public enum RefundStateEnum {
INITIATE_REFUND("发起退款"),
REFUNDING("退款中"),
REFUND_SUCCESS("退款成功"),
REFUND_FAILED("退款失败");
/**
* 避免和枚举类的name冲突
*/
public final String refundStateName;
}
@@ -0,0 +1,25 @@
package com.budwk.app.base.payment.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 交易渠道枚举
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "TradingChannelEnum", name = "交易渠道枚举")
public enum TradingChannelEnum {
QQ_PAY("QQ"),
WX_PAY("微信"),
JD_PAY("京东"),
ALI_PAY("支付宝"),
UNION_PAY("云闪付");
/**
* 避免和枚举类的name冲突
*/
public final String tradingChannelName;
}
@@ -0,0 +1,24 @@
package com.budwk.app.base.payment.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 支付状态枚举
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "TradingStateEnum", name = "支付状态枚举")
public enum TradingStateEnum {
WAITING_FOR_PAYMENT("等待支付"),
PAY_SUCCESS("支付成功"),
CANCEL_PAYMENT("取消支付");
/**
* 避免和枚举类的name冲突
*/
public final String tradingStateName;
}
@@ -0,0 +1,22 @@
package com.budwk.app.base.payment.enums;
import com.budwk.app.base.annotation.DictEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 交易类型枚举
*/
@Getter
@AllArgsConstructor
@DictEnum(key = "TradingTypeEnum", name = "交易类型枚举")
public enum TradingTypeEnum {
PAYMENT("付款"),
REFUND("退款");
/**
* 避免和枚举类的name冲突
*/
public final String tradingTypeName;
}
@@ -0,0 +1,30 @@
package com.budwk.app.base.payment.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @version 1.0
* @Author zzr
* @nameWxPayResultCode
* @Date 2025/3/10 10:27
* @注释 微信支付返回码
*/
@Getter
@AllArgsConstructor
public enum WxPayResultCode {
SUCCESS(200, "操作成功"),
APPID_MCHID_NOT_MATCH(400, "商户ID和服务号或企业微信号不匹配"),
INVALID_REQUEST(400, "无效请求"),
MCH_NOT_EXISTS(400, "商户号不存在"),
PARAM_ERROR(400, "参数错误"),
SIGN_ERROR(401, "签名错误"),
NO_AUTH(403, "商户无权限"),
OUT_TRADE_NO_USED(403, "商户订单号重复"),
FREQUENCY_LIMITED(429, "频率超限"),
SYSTEM_ERROR(500, "系统错误");
final int code;
final String msg;
}
@@ -0,0 +1,61 @@
package com.budwk.app.base.payment.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
/**
* 退款记录表
*/
@Data
@Table
@Comment("退款记录表")
@EqualsAndHashCode(callSuper = true)
public class PaymentRefundRecord extends BaseModel {
@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 paymentTransactionId;
@Column
@Comment("本次退款订单号")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String outRefundTradeNo;
@Column
@Comment("第三方支付的退款单号")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String refundNo;
@Column
@Comment("退款状态")
@ColDefine(type = ColType.VARCHAR,width = 30)
private String refundState;
@Column
@Comment("本次退款金额")
@ColDefine(type = ColType.INT)
private Integer refundAmount;
@Column
@Comment("原订单金额")
@ColDefine(type = ColType.INT)
private Integer total;
@Column
@Comment("交易返回数据")
@ColDefine(type = ColType.MYSQL_JSON)
private String resultJson;
}
@@ -0,0 +1,131 @@
package com.budwk.app.base.payment.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.math.BigDecimal;
/**
* 交易单表
*/
@Data
@Table
@Comment("交易订单表")
@EqualsAndHashCode(callSuper = true)
public class PaymentTransaction extends BaseModel {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("商户号")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String mchId;
@Column
@Comment("订单号,传递给交易系统,交易系统订单号")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String outTradeNo;
@Column
@Comment("交易系统交易号")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String transactionId;
@Column
@Comment("交易渠道")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String tradingChannel;
@Column
@Comment("交易类型")
@ColDefine(type = ColType.VARCHAR,width = 30)
private String tradingType;
@Column
@Comment("交易状态")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String tradingState;
@Column
@Comment("用户ID")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String userId;
@Column
@Comment("用户工号")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String loginName;
@Column
@Comment("用户姓名")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String userName;
@Column
@Comment("工会id")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String unionId;
@Column
@Comment("用户工会")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String unionName;
@Column
@Comment("单位id")
@ColDefine(type = ColType.VARCHAR,width = 32)
private String unitId;
@Column
@Comment("用户单位")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String unitName;
@Column
@Comment("交易金额")
@ColDefine(type = ColType.INT)
private Integer tradingAmount;
@Column
@Comment("是否退款")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isRefund;
@Column
@Comment("退款金额")
@ColDefine(type = ColType.INT)
private Integer refundAmount;
@Column
@Comment("订单描述")
@ColDefine(type = ColType.VARCHAR,width = 128)
private String description;
@Column
@Comment("附加详细描述")
@ColDefine(type = ColType.TEXT)
private String attach;
@Column
@Comment("微信支付用户openId")
@ColDefine(type = ColType.VARCHAR,width = 50)
private String openId;
@Column
@Comment("交易返回数据")
@ColDefine(type = ColType.MYSQL_JSON)
private String resultJson;
@Column
@Comment("交易名单的主键id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String memberPaymentInfoId;
}
@@ -0,0 +1,53 @@
package com.budwk.app.base.payment.wxpay.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @version 1.0
* @Author zzr
* @nameWxPayV3Bean
* @Date 2025/3/6 9:54
* @注释
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WxPayV3Bean {
/**
* 服务号
* appid: wxf12fa6175ec7c75f
* app_secret: f65bbb41d3de4a93c8c93d8e2fd50369
*/
private String appId;
private String keyPath;
private String publicKeyPath;
private String certPath;
private String certP12Path;
private String platformCertPath;
private String mchId;
private String apiKey;
private String apiKey3;
private String domain;
private String publicKeyId;
@Override
public String toString() {
return "WxPayV3Bean{" +
"appId='" + appId + '\'' +
", keyPath='" + keyPath + '\'' +
", publicKeyPath='" + publicKeyPath + '\'' +
", certPath='" + certPath + '\'' +
", certP12Path='" + certP12Path + '\'' +
", platformCertPath='" + platformCertPath + '\'' +
", mchId='" + mchId + '\'' +
", apiKey='" + apiKey + '\'' +
", apiKey3='" + apiKey3 + '\'' +
", domain='" + domain + '\'' +
", publicKeyId='" + publicKeyId + '\'' +
'}';
}
}
@@ -0,0 +1,44 @@
package com.budwk.app.base.payment.wxpay.controller;
import com.budwk.app.base.payment.wxpay.service.WxPayCommonService;
import io.swagger.annotations.ApiOperation;
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 javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @nameWxPayCommonController
* @Date 2025/3/10 19:28
* @注释 微信支付回调
*/
@Slf4j
@IocBean
@Ok("json:full")
@At("/platform/wxPay")
public class WxPayCommonController {
@Inject
private WxPayCommonService wxPayCommonService;
@At
@Ok("void")
@ApiOperation("微信支付-付款回调")
public void payNotify(HttpServletRequest request, HttpServletResponse response){
wxPayCommonService.payNotify(request, response);
}
@At
@Ok("void")
public void refundNotify(HttpServletRequest request, HttpServletResponse response){
wxPayCommonService.refundNotify(request, response);
}
}
@@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEKDCCAxCgAwIBAgIUONYpzvxVfV/RrWnLGPlL6/nb/AcwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjUwMzA2MTQwNDAzWhcNMzAwMzA1MTQwNDAzWjCBgTETMBEGA1UEAwwK
MTY2NjkzMDk4MDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
DCTmrabmsYnlnLDlpKfkuInmgJ3np5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYT
AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBALlDML+FJEW+m2hXp/qUH1cU6xlwFllLU4LjFusJkxwyzzcZO4nY0mOi
3woz8xIJipvUWj2Y413WYwMkfcJcRgghupZkfYwdQtSyPfUu7xQBUm8TLWGH88Re
kyyVABEB5T+ne6r3LesXS4IuZknm5N/iaa4z9mbbscGqF0GLvMUqZCRNyTkyfK9r
Bkvs/vspi+Jcjx9I7aU++h/vwzsGB6Bf/uB3kLMb+lj/i3xY20sdrrW8JD2sqONQ
NcRIKmNXSp4zsNy+d6kIKWE3P5609ZTta1ogkeGBNdGXMRNNy6vLIudQc7zny/9H
S4LxGsIrsYmZNhGljRng56X+PG3w1CUCAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQBQ5e8U
1pQ40gfRoZyO0s+QF16L8pAcVLVwHffo0mmJpIRB4bu8W5IJ9kKhksJ0CzZ0YEwB
Yv7/LTC1qpi7PE73nZ4Ytm9oZeH1Kk5KIlQS+2H3IwOpoV4wucMc34y6MVQJjC7E
u5OnglBPSAopwNP4p+Us9A3ah7Ks48XCw+LCEWpA/setJwo9C13Qq2AQm8qLpogK
pNBwm/oylxb8/kZK1lLPgcXd7geLDhl/Str+aOzBXyd7YSEMxS8zWiZhWozu6rCq
dg10QFKicPGDkDzNQwBz7cDXvlJXSWRDBK5r1li1YgX+QD5WJYPchATo5SlvF4Lr
5/V/dZzI7BJTinr1
-----END CERTIFICATE-----
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5QzC/hSRFvpto
V6f6lB9XFOsZcBZZS1OC4xbrCZMcMs83GTuJ2NJjot8KM/MSCYqb1Fo9mONd1mMD
JH3CXEYIIbqWZH2MHULUsj31Lu8UAVJvEy1hh/PEXpMslQARAeU/p3uq9y3rF0uC
LmZJ5uTf4mmuM/Zm27HBqhdBi7zFKmQkTck5MnyvawZL7P77KYviXI8fSO2lPvof
78M7BgegX/7gd5CzG/pY/4t8WNtLHa61vCQ9rKjjUDXESCpjV0qeM7DcvnepCClh
Nz+etPWU7WtaIJHhgTXRlzETTcuryyLnUHO858v/R0uC8RrCK7GJmTYRpY0Z4Oel
/jxt8NQlAgMBAAECggEBAKGQqTi9Ii741Ysftsze1J4bDhS3HaZt/LyO0vPS+8qB
vRiuFrBWuNRPu/en6nl2fLz9al2Bsfep+dtJvar80c5Rq+lwZdUFx7y6XTIv5iwq
IvvfW5pM+Bfu6qbcopwybP0gUMd+nTsCq8UyNd6JUFy3lbZodqCpQ9JDRdjRxqSi
oMonve36Q9kJyDs0mS2F0w+Y9oYFtpE9WvGMBthwT7VfzWuDa+YC/Gh0RhT2V9OG
uDC8kxmfaIbk0IITDVFWVMMhScXiqmJL1II9yQWsCHH73dZS+dDxwwH0ObRD3kOx
hHptxpRzhtuNxLjCOZDGhneyvUHIftpqf4wdOgQ8iUECgYEA6TDo36s3XDFIs8SH
lpVYrhie0nmaNET50CtOc5C2M1OotrkMUrQTMoa4F263UloJfqweW9AKZX11wPp2
8h7af2sZsGawjuwv7mMthZJoi0fc5J2+z6BnVGgFo7uZbcs1Y/+B0tNrDKIHVrqb
Lywmh18iKDXrMiMDMRp8mtiNyU0CgYEAy2Im0oGb1rmAh9gPvQIENmNEgRsyIU4x
WPAFb5KO7jnseO9KrC9uiRSO5JuwZu/QNGlga2w77Gu7n+Q4HfSU2KFlNhR6pKjb
mqXzPq1quryzbtWay520VsRKz3F/Tfp1FUpIuZvj8x7FrL8z8vjbLkbW4p+Z7HE4
heYdmk2KCjkCgYBC6xU48pJtc3swk2pxjSQoucoCDoFxFIY39eWKhnGy4wQcg5gE
t8Z2jnCP0ObszAfDgTMpF9eT7l/3ZCj0LGR5gkuZ8q4iJadPmsh6d1xm89VxCc+z
F43vi/ZqWTCbcGA+9RjVXnRu6KSAgAZ+kAXyfRt5PJflCGUnFznA2fo+VQKBgG6s
n7Gno/UKBv5lPdM9mKs8A5g6A2KKWWIrYtnfJ/ZNAPiiRsFCImVoEYYnjqvFTkhn
G3f5cvZpfbU5jKwIX0MvOJNgO4kE9lPGgIKX/d9WNlJW3KB21h7tPER8X6lAZJxM
SxztzvKKyUkC1zMd5q/dDqxN64X16qs6mNtR3I9JAoGBAJbqQtg59Szi2m4jZ9Xo
0cKvP7+PSKgysdWsemTkU0ji1rcMpGRTtcUGRWlawLjRSInQS+xNdL6GVU5mHZWe
gNwXIXEpape4IJta0B1PYAhNcIvOSh5CzcUnVTeo6q0CTSVQPdsivlrObLKZ4uGQ
eewDw82Ej6YoSgczjf99ug0x
-----END PRIVATE KEY-----
@@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIEFDCCAvygAwIBAgIUKN05Gm0Q9n9mLPPltUh8qjKKegQwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjUwMzA2MTQwNDAzWhcNMzAwMzA1MTQwNDAzWjBuMRgwFgYDVQQDDA9U
ZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl
bnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGEwJDTjERMA8GA1UEBwwIU2hlblpo
ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbMenF0GNlcUYErPpj
Aj+WOuzRFz+PJcrtgkI81S0WDh8flMtq1A2nwKARNyPXx+UPd9it657nH5G8E9kL
Ea5u5rENpn+JZc4cAIvZqazteSAUg2pfQH9ewW+/CxNOWarjXPNRYa0OjZWf+5F8
ZBOT/x8sJ2+jou9lxKNe1skha+jzmiQ8m3B2vPXqR87qgL/fyQjjpLvBGpvearh/
hxTMBEfGeB4F6Fu52Fz3/VCWe38ubxwj8EMcRSPp4xsl2BTaRVMMT525Hul2N49C
vXCSVsCNt3ND8UDffXnb19Zgpir4KqpECTbfqcT7YX+U34P1Av8gcDl6rRm+7Wpj
PY4RAgMBAAGjgbkwgbYwCQYDVR0TBAIwADALBgNVHQ8EBAMCA/gwgZsGA1UdHwSB
kzCBkDCBjaCBiqCBh4aBhGh0dHA6Ly9ldmNhLml0cnVzLmNvbS5jbi9wdWJsaWMv
aXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1NDk4NDZDMDFDM0U4
RUJEMiZzZz1IQUNDNDcxQjY1NDIyRTEyQjI3QTlEMzNBODdBRDFDREY1OTI2RTE0
MDM3MTANBgkqhkiG9w0BAQsFAAOCAQEAUAvXCx55ZGmd3ATi28W4mirnUHQb2RAw
X5/0OC2SkuBdzxI5RbY4YAuugP6nQIAU8TXCANzno2oqZ6vmFZ4dBnJmLewVFMoM
qp18A4RWmnsGnmEIgMm6N1kB+RbM11oLCLdy2KK0SvmqDmTBFJyjyUGqEmRshnV/
QfKn4UUzJ4suDFAolGX4DyDIOtM0D+SCHwwxGI4yf2+nj4IB8XgmmOeschxoSvu9
T3E6BgQ271YVDwg+3r9CiFVI5JdyftvQagOEQmZJMPINEKgFn5LzrZJW7mH42+N+
i4RFz04wpGUsrSFDESh3JxYSNhq/HulpMLinntWxEBHFhpkjyyGDGg==
-----END CERTIFICATE-----
@@ -0,0 +1,71 @@
package com.budwk.app.base.payment.wxpay.service;
import com.budwk.app.base.payment.wxpay.vo.WxPayNeedParamVo;
import com.budwk.app.base.result.Result;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @nameWxPayCommonService
* @Date 2025/3/6 11:40
* @注释
*/
public interface WxPayCommonService {
/**
* 二维码统一下单,返回支付二维码链接
* @param paramVo 需要传递的信息,请自定义付款金额Amount 和 付款描述Description,其他关键信息请勿修改
* 注意Amount的总价total是int类型,会自动乘以0.01,例如传递100元,会自动转换为1元
* @return
*/
Result nativePay(WxPayNeedParamVo paramVo);
/**
* JSAPI支付,返回支付参数
* @param paramVo 需要传递的信息,请自定义付款金额Amount 和 付款描述Description,其他关键信息请勿修改
* 注意Amount的总价total是int类型,会自动乘以0.01,例如传递100元,会自动转换为1元
* JsAPI支付,需要传递openId,请自行获取
* @return
*/
Result jsApiPay(WxPayNeedParamVo paramVo);
/**
* WAP支付,返回支付参数
* @param paramVo 需要传递的信息,请自定义付款金额Amount 和 付款描述Description,其他关键信息请勿修改
* 注意Amount的总价total是int类型,会自动乘以0.01,例如传递100元,会自动转换为1元
* @return
*/
Result wapPay(WxPayNeedParamVo paramVo);
/**
* 支付回调,验证是否支付成功
* @param request 请求
* @param response 响应
*/
void payNotify(HttpServletRequest request, HttpServletResponse response);
/**
* 退款
* @param transactionId 微信订单号
* @param outTradeNo 商户订单号
* @return
*/
Result refund(String transactionId, String outTradeNo);
/**
* 退款回调
* @param request 请求
* @param response 响应
*/
void refundNotify(HttpServletRequest request, HttpServletResponse response);
}
@@ -0,0 +1,612 @@
package com.budwk.app.base.payment.wxpay.service.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.payment.enums.*;
import com.budwk.app.base.payment.model.PaymentRefundRecord;
import com.budwk.app.base.payment.model.PaymentTransaction;
import com.budwk.app.base.payment.wxpay.bean.WxPayV3Bean;
import com.budwk.app.base.payment.wxpay.service.WxPayCommonService;
import com.budwk.app.base.payment.wxpay.vo.WxPayNeedParamVo;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.staffmanage.memberCost.model.MemberPaymentInfo;
import com.ijpay.core.IJPayHttpResponse;
import com.ijpay.core.enums.AuthTypeEnum;
import com.ijpay.core.enums.RequestMethodEnum;
import com.ijpay.core.kit.AesUtil;
import com.ijpay.core.kit.HttpKit;
import com.ijpay.core.kit.PayKit;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.enums.WxDomainEnum;
import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
import com.ijpay.wxpay.model.v3.*;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.random.R;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.FileWriter;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @version 1.0
* @Author zzr
* @nameWxPayCommonServiceImpl
* @Date 2025/3/6 11:41
* @注释
*/
@Slf4j
@IocBean
public class WxPayCommonServiceImpl implements WxPayCommonService {
// 判断下单接口成功返回码
private final static int OK = 200;
// 1666930980 商户号
// ww3eda050a1b5ad96e 企业微信
// wxf12fa6175ec7c75f 微信服务号
// 微信V3必要的支付参数,后期优化
private final static WxPayV3Bean WX_PAY_V3_BEAN = new WxPayV3Bean(
"wxf12fa6175ec7c75f",
"src/main/java/com/budwk/app/base/payment/wxpay/pem/apiclient_key.pem",
"src/main/java/com/budwk/app/base/payment/wxpay/pem/apiclient_key.pem",
"src/main/java/com/budwk/app/base/payment/wxpay/pem/apiclient_cert.pem",
"src/main/java/com/budwk/app/base/payment/wxpay/pem/apiclient_cert.pem",
"src/main/java/com/budwk/app/base/payment/wxpay/pem/wechatpay.pem",
"1666930980",
"",
"4ebd020883285d698c44ec50939c0967",
"https://schoolhd.top/platform",
"");
// 自定义参数,内容是统一的,但会被多次调用,直接声明
private String serialNo;
private String platSerialNo;
private final String payNotifyUrl = WX_PAY_V3_BEAN.getDomain().concat("/wxPay/payNotify");
private final String refundNotifyUrl = WX_PAY_V3_BEAN.getDomain().concat("/wxPay/refundNotify");
@Inject
private Dao dao;
@Inject
private SysUserService sysUserService;
/**
* 微信扫描二维码支付
* @param paramVo 需要传递的信息,请自定义付款金额Amount 和 付款描述Description,其他关键信息请勿修改
* 注意Amount的总价total是int类型,会自动乘以0.01,例如传递100元,会自动转换为1元
* @return
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public Result nativePay(WxPayNeedParamVo paramVo) {
try {
// 商户订单号,存储当前用户的订单
String outTradeNo = PayKit.generateStr();
String timeExpire = getNowTimeExpire();
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
.setAppid(WX_PAY_V3_BEAN.getAppId())
.setMchid(WX_PAY_V3_BEAN.getMchId())
// 描述信息
.setDescription(paramVo.getDescription())
.setOut_trade_no(outTradeNo)
.setTime_expire(timeExpire)
.setAttach(paramVo.getAttach())
.setNotify_url(payNotifyUrl)
// 订单金额
.setAmount(paramVo.getAmount());
log.info("二维码支付统一下单参数 {}", JSONUtil.toJsonStr(unifiedOrderModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
BasePayApiEnum.NATIVE_PAY.toString(),
WX_PAY_V3_BEAN.getMchId(),
getSerialNumber(),
null,
WX_PAY_V3_BEAN.getKeyPath(),
JSONUtil.toJsonStr(unifiedOrderModel),
AuthTypeEnum.RSA.getCode()
);
log.info("统一下单响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, WX_PAY_V3_BEAN.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
// 下单返回数据
String result = response.getBody();
JSONObject jsonObject = JSONUtil.parseObj(result);
if (response.getStatus() == OK) {
// 统一下单成功,向数据库插入订单记录
insertTradingOrder(paramVo, outTradeNo, result);
return Result.success("请在三分钟内完成支付,超时将自动取消订单").addData(result);
} else {
WxPayResultCode code = WxPayResultCode.valueOf(WxPayResultCode.class, jsonObject.getStr("code"));
return Result.error(code.getMsg());
}
} catch (Exception e) {
log.error("系统异常", e);
return Result.error(e.getMessage());
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public Result jsApiPay(WxPayNeedParamVo paramVo) {
try {
Sys_user user = dao.fetch(Sys_user.class, SecurityUtil.getUserId());
if (StrUtil.isBlank(user.getOpenId())) {
return Result.error("未获取到当前用户的openid,请重新登录");
}
// 商户订单号,存储当前用户的订单
String outTradeNo = PayKit.generateStr();
// 订单关闭时间
String timeExpire = getNowTimeExpire();
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
.setAppid(WX_PAY_V3_BEAN.getAppId())
.setMchid(WX_PAY_V3_BEAN.getMchId())
.setDescription(paramVo.getDescription())
.setOut_trade_no(outTradeNo)
.setTime_expire(timeExpire)
.setAttach(paramVo.getAttach())
.setNotify_url(payNotifyUrl)
.setAmount(paramVo.getAmount())
.setPayer(new Payer().setOpenid(user.getOpenId()));
log.info("统一下单参数 {}", JSONUtil.toJsonStr(unifiedOrderModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
BasePayApiEnum.JS_API_PAY.toString(),
WX_PAY_V3_BEAN.getMchId(),
getSerialNumber(),
null,
WX_PAY_V3_BEAN.getKeyPath(),
JSONUtil.toJsonStr(unifiedOrderModel)
);
log.info("统一下单响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, WX_PAY_V3_BEAN.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
String body = response.getBody();
JSONObject jsonObject = JSONUtil.parseObj(body);
String prepayId = jsonObject.getStr("prepay_id");
Map<String, String> map = WxPayKit.jsApiCreateSign(WX_PAY_V3_BEAN.getAppId(), prepayId, WX_PAY_V3_BEAN.getKeyPath());
log.info("唤起支付参数:{}", map);
// 唤起支付成功,向数据库插入订单参数
insertTradingOrder(paramVo, outTradeNo, body);
return Result.success().addData(JSONUtil.toJsonStr(map));
}
// return JSONUtil.toJsonStr(response);
return Result.error("唤起支付失败");
} catch (Exception e) {
log.error("系统异常", e);
return Result.error(e.getMessage());
}
}
@Override
@Aop(TransAop.READ_COMMITTED)
public Result wapPay(WxPayNeedParamVo paramVo) {
try {
// 商户订单号,存储当前用户的订单
String outTradeNo = PayKit.generateStr();
// 订单关闭时间
String timeExpire = getNowTimeExpire();
UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
.setAppid(WX_PAY_V3_BEAN.getAppId())
.setMchid(WX_PAY_V3_BEAN.getMchId())
.setDescription(paramVo.getDescription())
.setOut_trade_no(outTradeNo)
.setTime_expire(timeExpire)
.setAttach(paramVo.getAttach())
.setNotify_url(payNotifyUrl)
.setAmount(paramVo.getAmount())
.setScene_info(
new SceneInfo()
.setPayer_client_ip("").
setH5_info(new H5Info()
.setType("Wap")));
log.info("统一下单参数 {}", JSONUtil.toJsonStr(unifiedOrderModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
BasePayApiEnum.H5_PAY.toString(),
WX_PAY_V3_BEAN.getMchId(),
getSerialNumber(),
null,
WX_PAY_V3_BEAN.getKeyPath(),
JSONUtil.toJsonStr(unifiedOrderModel)
);
log.info("统一下单响应 {}", response);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, WX_PAY_V3_BEAN.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
if (response.getStatus() == OK && verifySignature) {
String body = response.getBody();
insertTradingOrder(paramVo, outTradeNo, body);
return Result.success(JSONUtil.toJsonStr(body));
}
// return JSONUtil.toJsonStr(response);
return Result.error();
} catch (Exception e) {
log.error("系统异常", e);
return Result.error(e.getMessage());
}
}
/**
* 支付回调
* @param request
* @param response
*/
@Override
public void payNotify(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> map = new HashMap<>(12);
try {
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String serialNo = request.getHeader("Wechatpay-Serial");
String signature = request.getHeader("Wechatpay-Signature");
log.info("timestamp:{} nonce:{} serialNo:{} signature:{}", timestamp, nonce, serialNo, signature);
String result = HttpKit.readData(request);
log.info("支付通知密文 {}", result);
// String plainText = null;
// 需要通过证书序列号查找对应的证书,verifyNotify 中有验证证书的序列号
String plainText = WxPayKit.verifyNotify(serialNo, result, signature, nonce, timestamp,
WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath());
// 微信公钥验证签名并解密
// if (ObjectUtil.equals(serialNo, WX_PAY_V3_BEAN.getPublicKeyId())) {
// plainText = WxPayKit.verifyPublicKeyNotify(result, signature, nonce, timestamp,
// WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath());
// }
log.info("支付通知明文 {}", plainText);
if (StrUtil.isNotEmpty(plainText)) {
// 支付结果
JSONObject jsonResult = JSONUtil.parseObj(plainText);
// 获取缴费记录,并修改缴费结果
PaymentTransaction transaction = sysUserService.dao().fetch(PaymentTransaction.class, Cnd.where("outTradeNo", "=", jsonResult.getStr("out_trade_no")));
transaction.setTradingState(TradingStateEnum.PAY_SUCCESS.name());
transaction.setTransactionId(jsonResult.getStr("transaction_id"));
sysUserService.dao().update(transaction);
sysUserService.dao().update(MemberPaymentInfo.class,
Chain.make("isPayment", true).add("paymentTime", DateUtil.date())
.add("paymentMoney", transaction.getTradingAmount()),
Cnd.where("id", "=", transaction.getMemberPaymentInfoId())
);
response.setStatus(200);
map.put("code", "SUCCESS");
map.put("message", "SUCCESS");
} else {
response.setStatus(500);
map.put("code", "ERROR");
map.put("message", "签名错误");
log.error("签名错误");
}
// 支付回调,返回给微信,自己也接收不到结果,这里的返回没用
response.setHeader("Content-type", ContentType.JSON.toString());
response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8));
response.flushBuffer();
} catch (Exception e) {
log.error("系统异常", e);
}
}
/**
* 退款
* @param transactionId 微信订单号
* @param outTradeNo 商户订单号
* @return
*/
@Override
public Result refund(String transactionId, String outTradeNo) {
try {
// 查询商户订单
PaymentTransaction transaction = sysUserService.dao().fetch(PaymentTransaction.class, Cnd.where("outTradeNo", "=", outTradeNo));
Integer tradingAmount = transaction.getTradingAmount();
String outRefundNo = PayKit.generateStr();
log.info("商户退款单号: {}", outRefundNo);
// 没用
// List<RefundGoodsDetail> list = new ArrayList<>();
// RefundGoodsDetail refundGoodsDetail = new RefundGoodsDetail()
// .setMerchant_goods_id("123")
// .setGoods_name("测试")
// .setUnit_price(1)
// .setRefund_amount(1)
// .setRefund_quantity(1);
// list.add(refundGoodsDetail);
RefundModel refundModel = new RefundModel()
.setOut_refund_no(outRefundNo)
.setReason(transaction.getDescription() + "退款")
.setNotify_url(refundNotifyUrl)
.setAmount(new RefundAmount().setRefund(tradingAmount).setTotal(tradingAmount).setCurrency("CNY"));
// .setGoods_detail(list);
if (StrUtil.isNotEmpty(transactionId)) {
refundModel.setTransaction_id(transactionId);
}
if (StrUtil.isNotEmpty(outTradeNo)) {
refundModel.setOut_trade_no(outTradeNo);
}
log.info("退款参数 {}", JSONUtil.toJsonStr(refundModel));
IJPayHttpResponse response = WxPayApi.v3(
RequestMethodEnum.POST,
WxDomainEnum.CHINA.toString(),
BasePayApiEnum.REFUND.toString(),
WX_PAY_V3_BEAN.getMchId(),
getSerialNumber(),
null,
WX_PAY_V3_BEAN.getKeyPath(),
JSONUtil.toJsonStr(refundModel)
);
// 根据证书序列号查询对应的证书来验证签名结果
boolean verifySignature = WxPayKit.verifySignature(response, WX_PAY_V3_BEAN.getPlatformCertPath());
// 微信支付公钥验证签名
// boolean verifySignature = WxPayKit.verifyPublicKeySignature(response, WX_PAY_V3_BEAN.getPlatformCertPath());
log.info("verifySignature: {}", verifySignature);
log.info("退款响应 {}", response);
if (verifySignature) {
// 用户发起退款,存一个退款记录
PaymentRefundRecord record = new PaymentRefundRecord();
record.setId(R.UU32());
record.setPaymentTransactionId(transaction.getId());
record.setOutRefundTradeNo(outRefundNo);
record.setRefundNo(null);
record.setRefundState(RefundStateEnum.REFUNDING.name());
record.setRefundAmount(tradingAmount);
record.setTotal(tradingAmount);
record.setResultJson(response.getBody());
dao.insert(record);
dao.update(MemberPaymentInfo.class, Chain.make("isRefund", true)
.add("refundState", RefundStateEnum.REFUNDING.name()),
Cnd.where("id", "=", transaction.getMemberPaymentInfoId()));
// 返回退款下单结果
return Result.success();
}
return Result.error("退款失败");
} catch (Exception e) {
log.error("系统异常", e);
return Result.error(e.getMessage());
}
}
/**
* 退款回调
* @param request
* @param response
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public void refundNotify(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> map = new HashMap<>(12);
try {
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String serialNo = request.getHeader("Wechatpay-Serial");
String signature = request.getHeader("Wechatpay-Signature");
log.info("退款通知 timestamp:{} nonce:{} serialNo:{} signature:{}", timestamp, nonce, serialNo, signature);
String result = HttpKit.readData(request);
log.info("退款通知密文 {}", result);
// String plainText = null;
// 需要通过证书序列号查找对应的证书,verifyNotify 中有验证证书的序列号
String plainText = WxPayKit.verifyNotify(serialNo, result, signature, nonce, timestamp,
WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath());
// 微信公钥验证签名并解密
// if (ObjectUtil.equals(serialNo, WX_PAY_V3_BEAN.getPublicKeyId())) {
// plainText = WxPayKit.verifyPublicKeyNotify(result, signature, nonce, timestamp,
// WX_PAY_V3_BEAN.getApiKey3(), WX_PAY_V3_BEAN.getPlatformCertPath());
// }
log.info("退款通知明文 {}", plainText);
if (StrUtil.isNotEmpty(plainText)) {
// 取出明文,修改退款的结果
JSONObject jsonObject = JSONUtil.parseObj(plainText);
// 查询出退款记录,存储关键信息并修改
PaymentRefundRecord record = dao.fetch(PaymentRefundRecord.class, Cnd.where("outRefundTradeNo", "=", jsonObject.getStr("out_refund_no")));
record.setRefundNo(jsonObject.getStr("refund_id"));
record.setRefundState(RefundStateEnum.REFUND_SUCCESS.name());
// 到此是退款成功了,还要去修改订单表的数据
PaymentTransaction transaction = dao.fetch(PaymentTransaction.class, record.getPaymentTransactionId());
dao.update(PaymentTransaction.class, Chain.make("isRefund", true)
.add("refundAmount", record.getRefundAmount()),
Cnd.where("id", "=", record.getPaymentTransactionId()));
dao.update(MemberPaymentInfo.class, Chain.make("isPayment", null).add("paymentMoney", null)
.add("refundState", RefundStateEnum.REFUND_SUCCESS.name()),
Cnd.where("id", "=", transaction.getMemberPaymentInfoId()));
dao.update(record);
response.setStatus(200);
map.put("code", "SUCCESS");
map.put("message", "SUCCESS");
} else {
response.setStatus(500);
map.put("code", "ERROR");
map.put("message", "签名错误");
}
// 没用
response.setHeader("Content-type", ContentType.JSON.toString());
response.getOutputStream().write(JSONUtil.toJsonStr(map).getBytes(StandardCharsets.UTF_8));
response.flushBuffer();
} catch (Exception e) {
log.error("系统异常", e);
}
}
/**
* 公共方法,获取证书序列号
* @return
*/
private String getSerialNumber() {
if (StrUtil.isEmpty(serialNo)) {
// 获取证书序列号
X509Certificate certificate = PayKit.getCertificate(WX_PAY_V3_BEAN.getCertPath());
if (null != certificate) {
serialNo = certificate.getSerialNumber().toString(16).toUpperCase();
// 提前两天检查证书是否有效
boolean isValid = PayKit.checkCertificateIsValid(certificate, WX_PAY_V3_BEAN.getMchId(), -2);
log.info("证书是否可用 {} 证书有效期为 {}", isValid, DateUtil.format(certificate.getNotAfter(), DatePattern.NORM_DATETIME_PATTERN));
}
// System.out.println("输出证书信息:\n" + certificate.toString());
// // 输出关键信息,截取部分并进行标记
// System.out.println("证书序列号:" + certificate.getSerialNumber().toString(16));
// System.out.println("版本号:" + certificate.getVersion());
// System.out.println("签发者:" + certificate.getIssuerDN());
// System.out.println("有效起始日期:" + certificate.getNotBefore());
// System.out.println("有效终止日期:" + certificate.getNotAfter());
// System.out.println("主体名:" + certificate.getSubjectDN());
// System.out.println("签名算法:" + certificate.getSigAlgName());
// System.out.println("签名:" + certificate.getSignature().toString());
}
System.out.println("serialNo:" + serialNo);
return serialNo;
}
/**
* 公共方法,获取平台证书序列号
* @return
*/
private String getPlatSerialNumber() {
if (StrUtil.isEmpty(platSerialNo)) {
// 获取平台证书序列号
X509Certificate certificate = PayKit.getCertificate(FileUtil.getInputStream(WX_PAY_V3_BEAN.getPlatformCertPath()));
platSerialNo = certificate.getSerialNumber().toString(16).toUpperCase();
}
System.out.println("platSerialNo:" + platSerialNo);
return platSerialNo;
}
/**
* 公共方法,保存平台证书
* @param associatedData
* @param nonce
* @param cipherText
* @param algorithm
* @param certPath
* @return
*/
private String savePlatformCert(String associatedData, String nonce, String cipherText, String algorithm, String certPath) {
try {
String key3 = WX_PAY_V3_BEAN.getApiKey3();
String publicKey;
if (StrUtil.equals(algorithm, AuthTypeEnum.SM2.getPlatformCertAlgorithm())) {
publicKey = PayKit.sm4DecryptToString(key3, cipherText, nonce, associatedData);
} else {
AesUtil aesUtil = new AesUtil(WX_PAY_V3_BEAN.getApiKey3().getBytes(StandardCharsets.UTF_8));
// 平台证书密文解密
// encrypt_certificate 中的 associated_data nonce ciphertext
publicKey = aesUtil.decryptToString(
associatedData.getBytes(StandardCharsets.UTF_8),
nonce.getBytes(StandardCharsets.UTF_8),
cipherText
);
}
if (StrUtil.isNotEmpty(publicKey)) {
// 保存证书
FileWriter writer = new FileWriter(certPath);
writer.write(publicKey);
// 获取平台证书序列号
X509Certificate certificate = PayKit.getCertificate(new ByteArrayInputStream(publicKey.getBytes()));
return certificate.getSerialNumber().toString(16).toUpperCase();
}
return "";
} catch (Exception e) {
log.error("保存平台证书异常", e);
return e.getMessage();
}
}
/**
* 公共方法,构建订单关闭时间,默认3分钟
* @return
*/
private String getNowTimeExpire() {
long currentTimeMillis = System.currentTimeMillis() + 1000 * 60 * 3;
// 将时间戳转换为 DateTime 对象
DateTime dateTime = DateUtil.date(currentTimeMillis);
return DateUtil.format(dateTime, "yyyy-MM-dd'T'HH:mm:ssXXX");
}
/**
* 公共方法,插入交易订单
* @param paramVo 交易必填参数Vo
* @param outTradeNo 商户交易号
* @param result 下单返回结构
*/
private void insertTradingOrder(WxPayNeedParamVo paramVo, String outTradeNo, String result){
View_user user = sysUserService.dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
PaymentTransaction transaction = new PaymentTransaction();
transaction.setId(R.UU32());
transaction.setMchId(WX_PAY_V3_BEAN.getMchId());
transaction.setOutTradeNo(outTradeNo);
transaction.setTransactionId(null);
transaction.setTradingChannel(TradingChannelEnum.WX_PAY.name());
transaction.setTradingType(TradingTypeEnum.PAYMENT.name());
transaction.setUserId(user.getId());
transaction.setLoginName(user.getLoginname());
transaction.setUserName(user.getUsername());
transaction.setUnitId(user.getUnitId());
transaction.setUnitName(user.getUnitName());
transaction.setUnionId(user.getUnionId());
transaction.setUnionName(user.getUnionName());
transaction.setTradingState(TradingStateEnum.WAITING_FOR_PAYMENT.name());
// 获取订单金额
transaction.setTradingAmount(paramVo.getAmount().getTotal());
transaction.setIsRefund(false);
transaction.setRefundAmount(null);
transaction.setDescription(paramVo.getDescription());
transaction.setAttach(paramVo.getAttach());
transaction.setOpenId(null);
transaction.setResultJson(result);
transaction.setMemberPaymentInfoId(paramVo.getMemberPaymentInfoId());
sysUserService.dao().insert(transaction);
}
}
@@ -0,0 +1,132 @@
package com.budwk.app.base.payment.wxpay.util;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RedisConstant;
import lombok.extern.slf4j.Slf4j;
import org.nutz.http.Http;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.Base64;
/**
* @version 1.0
* @Author zzr
* @nameWeChatUtils
* @Date 2025/3/10 14:13
* @注释
*/
@Slf4j
@IocBean
public class WeChatUtils {
private static final String ALGORITHM = "AES";
private static final String KEY = "4eXvXq1ZJmZj8z5z6yXvXq1ZJmZj8z5z";
@Inject
private RedisService redisService;
public static final String APPID = "wxf12fa6175ec7c75f";
public static final String SECRET = "f65bbb41d3de4a93c8c93d8e2fd50369";
// 获取code
public final static String CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
//获取网页access_token的接口地址
public final static String WEB_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code";
//获取用户信息地址
public final static String USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
// 获取access_token的接口地址(GET 限2000(次/天)
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 发送模板消息
public static final String SEND_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
/**
* 生成获取code的url
*
* @param redirectUrl
* @return
*/
public String getCodeUrl(String redirectUrl, String state) {
String requestUrl = null;
state = state == null ? "" : state;
try {
requestUrl = CODE_URL.replace("APPID", APPID).replace("REDIRECT_URI", URLEncoder.encode(redirectUrl, "UTF-8")).replace("STATE", state);
} catch (Exception e) {
e.printStackTrace();
}
return requestUrl;
}
/**
* 获取微信网页access_token 和 openid
*
* @param code
* @return
*/
public JSONObject getWebAccessTokenAndOpenid(String code) {
String requestUrl = WEB_ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", SECRET).replace("CODE", code);
return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject()));
}
/**
* 网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了
* <a href="https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html">...</a>
*
* @param webAccessToken
* @param openid
* @return
*/
public JSONObject getUserInfo(String webAccessToken, String openid) {
String requestUrl = USERINFO_URL.replace("ACCESS_TOKEN", webAccessToken).replace("OPENID", openid);
return JSONUtil.parseObj(HttpUtil.post(requestUrl, new JSONObject()));
}
/**
* 获取access_token 先从Redis获取,如果没有再调微信获取并存Redis
*
* @return
*/
public String getAccessToken() {
String token = redisService.get(RedisConstant.REDIS_KEY_WX_TOKEN);
if (StrUtil.isNotBlank(token)) {
return token;
}
String accessTokenUrl = ACCESS_TOKEN_URL.formatted(APPID, SECRET);
String accessToken = Json.fromJson(NutMap.class, Http.get(accessTokenUrl).getContent()).getString("access_token");
redisService.setex(RedisConstant.REDIS_KEY_WX_TOKEN, 60 * 60 * 2, accessToken);
return accessToken;
}
public String encrypt(String data) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public String decrypt(String encryptedData) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedBytes);
}
}
@@ -0,0 +1,37 @@
package com.budwk.app.base.payment.wxpay.vo;
import com.ijpay.wxpay.model.v3.Amount;
import com.ijpay.wxpay.model.v3.Payer;
import lombok.Data;
/**
* @version 1.0
* @Author zzr
* @nameWxPayNeedParamVo
* @Date 2025/3/7 18:43
* @注释
*/
@Data
public class WxPayNeedParamVo {
/**
* 订单描述,会显示在支付界面的标题,最大长度127,必填
*/
private String description;
/**
* 附加数据,订单的详细描述信息,不必填
*/
private String attach;
/**
* 金额对象,对象中的 total 是金额,必填;
* 其余参数可不传递也可不填
*/
private Amount amount;
/**
* 会员支付信息ID,必填
*/
private String memberPaymentInfoId;
}
@@ -1,196 +1,61 @@
package com.budwk.app.sys.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
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.Date;
import java.util.List;
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@Table("sys_user_history")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@TableIndexes({@Index(name = "INDEX_SYS_USER_HISTORY_LOGINNAMAE", fields = {"loginname"}, unique = false)})
@TableIndexes({
@Index(name = "INDEX_HISTORY_USER_LOGINNAMAE", fields = {"loginname"}, unique = false),
@Index(name = "INDEX_HISTORY_USER_UNIT", fields = {"unitId"}, unique = false),
})
@Comment("用户历史记录")
public class Sys_user_history extends BaseModel implements Serializable {
public class Sys_user_history extends Sys_user {
@Name
@Column
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
@ColDefine(type = ColType.VARCHAR, width = 32)
private String id;
@Column
@Comment("用户名")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String loginname;
@Comment("更新时间")
@ColDefine(type = ColType.DATETIME)
private Date changeTime;
/**
* @see com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType
*/
@Column
@Comment("姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String username;
@Column
@Comment("性别")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String sex;
@Column
@Comment("电子邮箱")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String email;
@Column
@Comment("手机号码")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String mobile;
@Column
@Comment("工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("工会名称")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String unionName;
@Column
@Comment("单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("单位名称")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String unitName;
@Column
@Comment("在职状态")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String userState;
@Column
@Comment("人事编制")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String preparedBy;
@Column
@Comment("人员类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String personType;
@Column
@Comment("来校年月")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String comeSchoolDate;
@Column
@Comment("出生日期")
@ColDefine(type = ColType.DATE)
private Date birthday;
@Column
@Comment("党政职务")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String governmentPosition;
@Column
@Comment("技术职称")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String technicalTitle;
@Column
@Comment("民族")
@ColDefine(type = ColType.VARCHAR, width = 15)
private String nation;
@Column
@Comment("国籍")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String nationality;
@Column
@Comment("证件类型")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String icCardType;
@Column
@Comment("证件号码")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String idCard;
@Column
@Comment("政治面貌")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String political;
@Column
@Comment("学历")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String education;
@Column
@Comment("学位")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String academicDegree;
@Column
@Comment("个人简况")
@ColDefine(type = ColType.VARCHAR, customType = "text")
private String personalData;
@Column
@Comment("是否双肩挑")
@ColDefine(type = ColType.BOOLEAN)
private Boolean manyUnit;
@Column
@Comment("是否会员")
@ColDefine(type = ColType.AUTO)
private Boolean member;
@Column
@Comment("是否愿意加入重大疾病爱心基金互助会")
@ColDefine(type = ColType.BOOLEAN)
private Boolean wantJoinLoveMutualAidAssociation;
@Column
@Comment("是否福利会员")
@ColDefine(type = ColType.AUTO)
private Boolean welfareMember;
@Column
@Comment("异动类型")
@Comment("变更类型(多种)")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> changeTypes;
@Column
@Comment("家庭成员")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> families;
@Column
@Comment("博士后进站时间")
@ColDefine(type = ColType.DATE)
private Date postDoctoralJoinDate;
@Column
@Comment("异动时间")
@ColDefine(type = ColType.DATETIME)
private Date changeTime;
@Column
@Comment("异动来源")
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("变更来源")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String changeOrigin;
@Column
@ColDefine(type = ColType.VARCHAR, width = 100)
@Comment("变更原因")
private String changeReason;
@Column
@Comment("会员变更表记录id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String recordId;
@Column
@Comment("详细变更记录,用于查询、列表展示")
@ColDefine(type = ColType.MYSQL_JSON)
@@ -200,19 +65,4 @@ public class Sys_user_history extends BaseModel implements Serializable {
@Comment("详细变更记录,文本类型,可用于导出")
@ColDefine(type = ColType.TEXT)
private String changeInfosStr;
@Column
@Comment("变更原因")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String changeReason;
@Column
@Comment("会员变更记录表")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String recordId;
@Column
@Comment("变更说明")
@ColDefine(type = ColType.TEXT)
private String remark;
}
@@ -1,23 +1,13 @@
package com.budwk.app.sys.services.impl;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.thread.AsyncUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.event.user.SysUserEvent;
import com.budwk.app.base.event.user.SysUserPublisher;
import com.budwk.app.base.utils.ConditionGroupUtil;
import com.budwk.app.base.utils.ManyAddOrRenewUtil;
import com.budwk.app.base.utils.PwdUtil;
import com.budwk.app.sys.annotation.DataCenterColumn;
import com.budwk.app.sys.models.*;
@@ -28,33 +18,23 @@ import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeOrigin;
import com.budwk.app.zhgh.staffmanage.member.constant.MemberChangeType;
import com.budwk.app.zhgh.staffmanage.member.service.MemberManageService;
import com.budwk.app.zhgh.staffmanage.specialstaff.model.SpecialStaff;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.Mvcs;
import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.io.File;
import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
@@ -170,4 +170,8 @@ public class View_user {
@Column
private Date postDoctoralJoinDate;
// 福利享受截止日期
@Column
private Date welfareStopDate;
}
@@ -48,4 +48,6 @@ public interface TaskPlatformService {
* @return
*/
List<String> getCronExeTimes(String cronExpression) throws Exception;
List<String> getCronExeTimesPlus(String cronExpression) throws Exception;
}
@@ -5,6 +5,7 @@ import org.nutz.integration.quartz.QuartzJob;
import org.nutz.integration.quartz.QuartzManager;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.quartz.CronExpression;
import org.quartz.JobKey;
import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;
@@ -96,4 +97,22 @@ public class TaskPlatformServiceImpl implements TaskPlatformService {
}
return list;
}
@Override
public List<String> getCronExeTimesPlus(String cronExpression) throws Exception {
// 创建一个列表来存储执行时间
List<String> executionTimes = new ArrayList<>();
// 创建 CronTriggerImpl 对象,并设置 cron 表达式
CronTriggerImpl cronTrigger = new CronTriggerImpl();
cronTrigger.setCronExpression(new CronExpression(cronExpression));
// 计算未来的执行时间
List<Date> nextExecutionTimes = TriggerUtils.computeFireTimes(cronTrigger, null, 5);
// 格式化日期并添加到执行时间列表中
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (Date date : nextExecutionTimes) {
executionTimes.add(dateFormat.format(date));
}
return executionTimes;
}
}
@@ -37,6 +37,8 @@ public class Globals {
public static String AppDomain = "http://127.0.0.1";
//文件访问域名
public static String AppFileDomain = "";
//学校代码
public static String SchoolCode = "HMC";
//系统自定义参数
public static NutMap MyConfig = NutMap.NEW();
//自定义路由
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.controller;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareApplyController
* @Date 2025/7/31 15:46
* @注释
*/
public class ActivityDeclareApplyController {
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.activity.declarereimbursement.declare.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.Table;
/**
* @version 1.0
* @Author zzr
* @nameActivityDeclareInfo
* @Date 2025/7/31 15:38
* @注释
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ActivityDeclareInfo extends BaseModel {
}
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.controller;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursementApplyController
* @Date 2025/7/31 15:47
* @注释
*/
public class ActivityReimbursementApplyController {
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.activity.declarereimbursement.reimbursement.models;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.Table;
/**
* @version 1.0
* @Author zzr
* @nameActivityReimbursement
* @Date 2025/7/31 15:43
* @注释
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ActivityReimbursementInfo extends BaseModel {
}
@@ -0,0 +1,16 @@
package com.budwk.app.zhgh.activity.fitnesswalk.contants;
import lombok.Data;
import java.util.List;
/**
* 获取活动的树形结构
*/
@Data
public class Cascader {
private String value;
private String label;
private List<Cascader> children;
}
@@ -0,0 +1,18 @@
package com.budwk.app.zhgh.activity.fitnesswalk.contants;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum FitnessWalkMode {
PUNCH("punch", "打卡"),
STEP_COUNT("stepCount", "计步"),
GPS("gps", "GPS");
private final String value;
private final String desc;
}
@@ -0,0 +1,133 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
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.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
@IocBean
@Ok("json")
@ApiOperation("健步走-同步绑定记录")
@At("/platform/fitnessWalk/bindingRecord")
public class FitnessWalkActivityBindingRecordController {
@Inject
private WeAppCloudUtil weAppCloudUtil;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/bindingRecord.html")
@SaCheckPermission("fitnessWalk.bindingRecord")
public void index() {
}
/**
* 获取用户绑定记录
* @param keyWord
* @param unionId
* @param searchName
* @param searchKeyword
* @param pageNumber
* @param pageSize
* @param pageOrderName
* @param pageOrderBy
* @return
* @throws IOException
*/
@At
@ApiOperation("获取用户绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result pageData(@Param("keyWord") String keyWord,
@Param("unionId") String unionId,
@Param("searchName") String searchName,
@Param("searchKeyword") String searchKeyword,
@Param("pageNumber") int pageNumber, @Param("pageSize") int pageSize,
@Param("pageOrderName") String pageOrderName,
@Param("pageOrderBy") String pageOrderBy) {
int skip = (pageNumber == 1 ? 0 : (pageNumber - 1)) * pageSize;
StringBuilder sql = new StringBuilder("db.collection('login_record')");
if (StrUtil.isNotBlank(keyWord)) {
sql.append(".where(");
sql.append("_.or([");
sql.append("{loginname:{$regex:'").append(keyWord).append("',$options:'i'}},");
sql.append("{username:{$regex:'").append(keyWord).append("',$options:'i'}}");
sql.append("])");
sql.append(")");
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
sql.append(".where({'data.unionid':'").append(SecurityUtil.getUnionId()).append("'})");
} else {
if (Strings.isNotBlank(unionId)) {
sql.append(".where({'data.unionid':'").append(unionId).append("'})");
}
}
sql.append(".field({ data: false })");
sql.append(".skip(").append(skip).append(")");
sql.append(".limit(").append(pageSize).append(")");
sql.append(".get()");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
List<NutMap> data = jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.toBean((String) v, NutMap.class))
.collect(Collectors.toList());
JSONObject pager = jsonObject.getJSONObject("pager");
Pagination pagination = new Pagination(pageNumber, pageSize, pager.getInt("Total"), data);
return Result.success().addData(pagination);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* 删除绑定记录
* @param ids
* @return
*/
@At
@ApiOperation("删除绑定记录")
@SLog(tag = "健步走-同步绑定记录", msg = "删除绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result delete(String[] ids) {
String sql = "db.collection('login_record').where({_id:_.in(" + Json.toJson(ids) + ")}).remove()";
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, sql);
return Result.success();
}
/**
* 删除所有绑定记录
* @return
*/
@At
@ApiOperation("删除所有绑定记录")
@SLog(tag = "健步走-同步绑定记录", msg = "删除所有绑定记录")
@SaCheckPermission("fitnessWalk.bindingRecord")
public Result deleteAll() {
String sql = "db.collection('login_record').where({_id: _.neq('0')}).remove()";
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, sql);
return Result.success();
}
}
@@ -0,0 +1,337 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_task;
import com.budwk.app.sys.services.SysTaskService;
import com.budwk.app.sys.services.SysUserService;
import com.budwk.app.task.services.TaskPlatformService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
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 java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@IocBean
@Ok("json")
@ApiOperation("健步走-活动管理")
@At("/platform/fitnessWalk/activityManage")
public class FitnessWalkActivityManageController {
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private SysTaskService sysTaskService;
@Inject
private SysUserService sysUserService;
@Inject
private TaskPlatformService taskPlatformService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/activityManage.html")
@SaCheckPermission("fitnessWalk.activityManage")
public void index() {
}
@At
@ApiOperation("获取活动数据")
@SaCheckPermission("fitnessWalk.activityManage")
public Result pageData(@Param("year") Integer year, @Param("unionId") String unionId, @Param("searchName") String searchName,
@Param("searchKeyword") String searchKeyword, @Param("pageNumber") int pageNumber,
@Param("pageSize") int pageSize, @Param("pageOrderName") String pageOrderName,
@Param("pageOrderBy") String pageOrderBy) {
int skip = (pageNumber == 1 ? 0 : (pageNumber - 1)) * pageSize;
StringBuilder sql = new StringBuilder("db.collection('activity')");
if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) {
sql.append("where(");
sql.append("_.or([");
sql.append("{name:{$regex:'").append(searchKeyword).append("',$options:'i'}}");
sql.append("{tag:{$regex:'").append(searchKeyword).append("',$options:'i'}}");
sql.append("])");
sql.append(")");
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
sql.append(".where({unionId:'").append(SecurityUtil.getUnionId()).append("'})");
} else if (StrUtil.isNotBlank(unionId)) {
sql.append(".where({unionId:'").append(unionId).append("'})");
}
sql.append(".skip(").append(skip).append(")");
sql.append(".limit(").append(pageSize).append(")");
sql.append(".get()");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
List<FitnessWalkActivity> data = jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.toBean((String) v, FitnessWalkActivity.class))
.collect(Collectors.toList());
JSONObject pager = jsonObject.getJSONObject("pager");
Pagination pagination = new Pagination(pageNumber, pageSize, pager.getInt("Total"), data);
return Result.success().addData(pagination);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@At
@ApiOperation("添加活动")
@SLog(tag = "健步走-活动管理", msg = "添加活动")
@SaCheckPermission("fitnessWalk.activityManage")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doAdd(@Param("fitnessWalkActivity") FitnessWalkActivity fitnessWalkActivity,
@Param("file") TempFile tempFile,
@Param("stepFiles") TempFile[] stepFiles,
@Param("certificateFile") TempFile certificateTempFile) {
try {
//设置时间
if ("punch".equals(fitnessWalkActivity.getActivityModel())) {
fitnessWalkActivity.setApplyStartTime(fitnessWalkActivity.getApplyTime()[0]);
fitnessWalkActivity.setApplyEndTime(fitnessWalkActivity.getApplyTime()[1]);
}
fitnessWalkActivity.setStartTime(fitnessWalkActivity.getTime()[0]);
fitnessWalkActivity.setEndTime(fitnessWalkActivity.getTime()[1]);
if (tempFile != null) {
String fileId = weAppCloudUtil.uploadFile("activity/", tempFile.getFile());
fitnessWalkActivity.setCover(fileId);
}
if (Lang.isNotEmpty(stepFiles)) {
List<String> stepFileIdList = new ArrayList<>();
for (TempFile file : stepFiles) {
String fileId = weAppCloudUtil.uploadFile("activity/", file.getFile());
stepFileIdList.add(fileId);
}
fitnessWalkActivity.setRandomPics(stepFileIdList);
}
if (certificateTempFile != null) {
String fileId = weAppCloudUtil.uploadFile("activity/", certificateTempFile.getFile());
fitnessWalkActivity.setCompletionCertificateCover(fileId);
}
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name(), RoleConstant.BRANCH_UNION_ADMIN.name())
&& !AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
fitnessWalkActivity.setUnionId(SecurityUtil.getUnionId());
} else {
fitnessWalkActivity.setUnionId("");
}
fitnessWalkActivity.setNote(fitnessWalkActivity.getNote().replace("\"", "'"));
StringBuilder sql = new StringBuilder();
sql.append("db.collection('activity').add({data:").append(Json.toJson(fitnessWalkActivity)).append("})");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.INSERT, sql.toString());
fitnessWalkCommonService.addLotteryTask(fitnessWalkActivity);
fitnessWalkCommonService.addOrEditDoSaveRedis(fitnessWalkActivity);
return Result.success();
} catch (Exception e) {
return Result.error(e.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
@At
@Ok("json:full")
@ApiOperation("根据Id获取健步走活动")
@SaCheckPermission("fitnessWalk.activityManage")
public Result findOne(String id) {
return Result.success(fitnessWalkCommonService.getActivity(id));
}
@At
@Ok("json")
@ApiOperation("获取附件")
@SaCheckPermission("fitnessWalk.activityManage")
public Result getFile(String pic) {
try {
NutMap res = NutMap.NEW();
String imgurl = weAppCloudUtil.httpFile(pic);
HashMap<String, Object> imgmap = new HashMap<>();
imgmap.put("status", "success");
imgmap.put("name", imgurl.substring(imgurl.lastIndexOf("/") + 1));
imgmap.put("id", imgurl);
imgmap.put("url", imgurl);
res.setv("img", imgmap);
return Result.success().addData(res);
} catch (Exception e) {
return Result.error();
}
}
@At
@ApiOperation("修改健步走活动")
@SaCheckPermission("fitnessWalk.activityManage")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doEdit(@Param("fitnessWalkActivity") FitnessWalkActivity fitnessWalkActivity,
@Param("file") TempFile tempFile,
@Param("stepFiles") TempFile[] stepFiles,
@Param("certificateFile") TempFile certificateTempFile) {
//设置时间
if ("punch".equals(fitnessWalkActivity.getActivityModel())) {
fitnessWalkActivity.setApplyStartTime(fitnessWalkActivity.getApplyTime()[0]);
fitnessWalkActivity.setApplyEndTime(fitnessWalkActivity.getApplyTime()[1]);
}
fitnessWalkActivity.setStartTime(fitnessWalkActivity.getTime()[0]);
fitnessWalkActivity.setEndTime(fitnessWalkActivity.getTime()[1]);
if (tempFile != null) {
String fileId = weAppCloudUtil.uploadFile("activity/", tempFile.getFile());
fitnessWalkActivity.setCover(fileId);
}
if (Lang.isNotEmpty(stepFiles)) {
List<String> stepFileIdList = new ArrayList<>();
for (TempFile file : stepFiles) {
String fileId = weAppCloudUtil.uploadFile("activity/", file.getFile());
stepFileIdList.add(fileId);
}
fitnessWalkActivity.setRandomPics(stepFileIdList);
}
if (certificateTempFile != null) {
String fileId = weAppCloudUtil.uploadFile("activity/", certificateTempFile.getFile());
fitnessWalkActivity.setCompletionCertificateCover(fileId);
}
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name(), RoleConstant.BRANCH_UNION_ADMIN.name())
&& !AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
fitnessWalkActivity.setUnionId(SecurityUtil.getUnionId());
} else {
fitnessWalkActivity.setUnionId("");
}
fitnessWalkActivity.setNote(fitnessWalkActivity.getNote().replace("\"", "'"));
StringBuilder sql = new StringBuilder();
sql.append("db.collection('activity').doc('")
.append(fitnessWalkActivity.get_id())
.append("').update({data:").append(Json.toJson(fitnessWalkActivity)).append("})");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.UPDATE, sql.toString());
fitnessWalkCommonService.addLotteryTask(fitnessWalkActivity);
fitnessWalkCommonService.addOrEditDoSaveRedis(fitnessWalkActivity);
return Result.success();
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@At
@ApiOperation("删除健步走活动")
@SLog(tag = "健步走-活动管理", msg = "删除活动")
@SaCheckPermission("fitnessWalk.activityManage")
public Result delete(String id) {
try {
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, "db.collection('activity').doc('" + id + "').remove()");
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, "db.collection('register').where({activity_id:'" + id + "'}).remove()");
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, "db.collection('sign').where({activity_id:'" + id + "'}).remove()");
weAppCloudUtil.request(WeAppCloudUtil.CRUD.DELETE, "db.collection('gift_voucher').where({activity_id:'" + id + "'}).remove()");
List<Sys_task> sys_tasks = sysTaskService.query(Cnd.where("note", "=", id));
if (sys_tasks != null) {
sys_tasks.forEach(v -> {
taskPlatformService.delete(v.getId(), v.getId());
sysTaskService.delete(v.getId());
});
}
return Result.success();
} catch (Exception e) {
return Result.error();
}
}
/**
* 健身走健步模式通知提醒
*
* @param map
*/
private void addNotifyTask(NutMap map) {
if (map.getBoolean("sendNotify")) {
String id = map.getString("_id");
String name = map.getString("name");
String groupId = map.getString("groupId");
//提醒频率
int notifyGap = 10;
List<Sys_task> sys_tasks = sysTaskService.query(Cnd.where("note", "=", id));
if (Lang.isNotEmpty(sys_tasks)) {
sys_tasks.forEach(v -> {
taskPlatformService.delete(v.getId(), v.getId());
sysTaskService.delete(v.getId());
});
}
DateTime startTime = DateUtil.date(map.getLong("start_time"));
DateTime endTime = DateUtil.date(map.getLong("end_time"));
Set<DateTime> result = new HashSet<>();
DateTime offsetDay = DateUtil.offsetDay(startTime, notifyGap);
while (offsetDay.isBefore(endTime) && offsetDay.isAfter(new Date())) {
result.add(offsetDay);
offsetDay = DateUtil.offsetDay(offsetDay, notifyGap);
}
//活动结束前一天再添加一个日期提醒
result.add(DateUtil.offsetDay(endTime, -1));
for (DateTime dateTime : result) {
Sys_task sys_task = new Sys_task();
sys_task.setName(name);
sys_task.setNote(id);
sys_task.setJobClass("io.v.nutz.task.job.walking.WalkingNotifyJob");
sys_task.setData(Json.toJson(Map.of("groupId", groupId)));
sys_task.setDisabled(false);
String dateFormat = "ss mm HH dd MM ? yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String corn = sdf.format(dateTime);
sys_task.setCron(corn);
sysTaskService.insert(sys_task);
taskPlatformService.add(sys_task.getId(), sys_task.getId(), sys_task.getJobClass(), sys_task.getCron(), sys_task.getNote(), sys_task.getData());
}
}
}
}
@@ -0,0 +1,52 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* 健身走公共答题
*/
@IocBean
@At("/platform/fitnessWalk/common")
@Ok("json:full")
public class FitnessWalkCommonController {
// @Inject
// private QuestionService questionService;
//
// @Inject
// private QuestionIssueService questionIssueService;
//
// @Inject
// private QuestionWorService questionWorService;
//
// @Inject
// private QuestionReplyService questionReplyService;
//
// @At
// public Object getQuestion() {
// return questionService.query(Cnd.where("qflag", "=", 2));
// }
//
// @At
// public Object getIssueById(String id) {
// List<Question_issue> questionIssues = questionIssueService.query(Cnd.where("iqid", "=", id).asc("ipxbh"));
// questionIssues.forEach(issue -> {
// issue.setWors(questionWorService.query(Cnd.where("wiid", "=", issue.getIid()).asc("wpxbh")));
// });
// return questionIssues;
// }
//
// @At
// public Object saveAnswer(@Param("reply") Question_reply[] replys) {
// for (Question_reply reply : replys) {
// reply.setSave(false);
// reply.setRidentity(R.UU32());
// reply.setRtime(DateUtil.getDate());
// questionReplyService.insert(reply);
// }
// return null;
// }
}
@@ -0,0 +1,75 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.services.SysUserService;
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.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @author: Aaron
* @create: 2020-09-11 13:50
* @description: 小程序登录
**/
@At("/platform/fitnessWalk/login")
@Ok("json:full")
@IocBean
public class FitnessWalkLoginController {
@Inject
private SysUserService sysUserService;
@At("/")
public Object index(String username, String loginname) {
try {
Sql sql = Sqls.create("""
SELECT
u.id userid,
u.username,
u.loginname,
u.sex,
u.mobile,
u.birthday,
unit.`name` unitname,
u.unitid,
u.member,
unit.unionid,
un.unionname,
group_concat(sr.`code`) roles
FROM
sys_user u
LEFT JOIN sys_unit unit ON u.unitid = unit.id
LEFT JOIN sys_union un ON unit.unionid = un.id
LEFT JOIN sys_user_role sur ON sur.userId = u.id
LEFT JOIN sys_role sr ON sr.id = sur.roleId
$condition
""").setParam("loginname", loginname).setParam("username", username);
Cnd cnd = Cnd.NEW();
cnd.and("LOWER(u.loginname)", "=", loginname.trim().toLowerCase());
cnd.and("LOWER(u.username)", "=", username.trim().toLowerCase());
sql.setCondition(cnd);
sql.setCallback(Sqls.callback.map());
sysUserService.dao().execute(sql);
NutMap user = (NutMap) sql.getResult();
if (StrUtil.isBlank(user.getString("userid"))) {
return Result.error().addMsg("系统查询不到您的信息,请与工会管理员联系!");
}
// if(user.getInt("member",0)==0){
// return Result.error().addMsg("您没有权限参加本次健步行,请与工会管理员联系!");
// }
/*if (user.getInt("member", 0) != 1 && !user.getString("sex", "").equals("女")) {
return Result.error().addMsg("您没有权限参加本次健步行,请与工会管理员联系!");
}*/
return Result.success().addData(user);
} catch (Exception e) {
return Result.error();
}
}
}
@@ -0,0 +1,258 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_user;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkPunchLottery;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
/**
* 打卡抽奖
*/
@IocBean
@Ok("json")
@ApiOperation("健步走打卡抽奖")
@At("/platform/fitnessWalk/punchLottery")
public class FitnessWalkPunchLotteryController {
private final ReentrantLock lock = new ReentrantLock(true);
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private RedisService redisService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/punchLottery.html")
public void index() {
}
/**
* 打卡完成之后抽奖
*
* @param activityId 活动Id
* @param userId 用户Id
* @return
*/
@At
@ApiOperation("打卡模式的抽奖")
public Result judgeWinningToPunch(String activityId, String userId) {
try {
if (StrUtil.isBlank(activityId) && StrUtil.isBlank(userId)) {
return Result.error("参数错误");
}
lock.lock();
int winingCount = fitnessWalkCommonService.dao().count(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
if (winingCount > 0) {
return null;
}
// 把中奖的用户直接存到redis里面去
String redisKey = this.getClass().getName() + "#judgeWinningToPunch#activityid:" + activityId + "#PRIZELIST:";
String getPrizeIndexesKey = this.getClass().getName() + "#judgeWinningToPunch#activityid:" + activityId + "#GETPRIZEINDEXES:";
// redisService.del(getPrizeIndexesKey);
// 获取奖品列表
List<FitnessWalkActivity.PunchLotteryPrize> punchLotteryPrizes = new ArrayList<>();
String punchLotteryPrizesJson = redisService.get(redisKey);
if (StrUtil.isNotBlank(punchLotteryPrizesJson)) {
punchLotteryPrizes = JSONUtil.toList(punchLotteryPrizesJson, FitnessWalkActivity.PunchLotteryPrize.class);
} else {
JSONObject prizeJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, "db.collection('activity').doc('%s').field({punchLotteryPrizes: true}).get()".formatted(activityId));
List<FitnessWalkActivity.PunchLotteryPrize> prizeList = JSONUtil.parseObj((String) prizeJsonObject.getJSONArray("data").get(0)).getJSONArray("punchLotteryPrizes").toList(FitnessWalkActivity.PunchLotteryPrize.class);
redisService.set(redisKey, JSONUtil.toJsonStr(prizeList));
punchLotteryPrizes = prizeList;
}
List<Integer> winningUserIndexList = null;
//奖项,抽取多少个
int sum = punchLotteryPrizes.stream().mapToInt(v -> Integer.parseInt(v.getNum())).sum();
//判断是否有key,可以获得奖项的下标数组
if (!redisService.exists(getPrizeIndexesKey)) {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, "db.collection('register').where({activity_id:'%s'}).count()".formatted(activityId));
JSONObject pager = jsonObject.getJSONObject("pager");
String total = pager.getStr("Total");
//报名人数的一半,从这里的人中取数(最多抽取人数)
Integer lotteryNum = (int) Math.ceil(Double.parseDouble(total) / 2);
winningUserIndexList = generateRandomNumber(1, lotteryNum, sum);
redisService.set(getPrizeIndexesKey, JSONUtil.toJsonStr(winningUserIndexList));
} else {
String data = redisService.get(getPrizeIndexesKey);
winningUserIndexList = JSONUtil.toList(data, Integer.class);
}
List<FitnessWalkPunchLottery> punchLotteryList = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId));
Sys_user user = fitnessWalkCommonService.dao().fetch(Sys_user.class, Cnd.where("id", "=", userId));
FitnessWalkPunchLottery punchLottery = new FitnessWalkPunchLottery();
punchLottery.setId(R.UU32());
punchLottery.setActivityId(activityId);
punchLottery.setUserId(userId);
punchLottery.setLoginName(user.getLoginname());
punchLottery.setUserName(user.getUsername());
punchLottery.setWinDate(new Date());
punchLottery.setIsRead(false);
punchLottery.setIsWin(false);
punchLottery.setIsExchange(false);
if (winningUserIndexList.contains((punchLotteryList.size()))) {
//奖项map
Map<String, String> prizeMap = punchLotteryPrizes.stream().collect(Collectors.toMap(FitnessWalkActivity.PunchLotteryPrize::getValue, FitnessWalkActivity.PunchLotteryPrize::getName));
//奖项池
List<String> prizeIdList = new ArrayList<>();
punchLotteryPrizes.forEach(v -> {
for (int i = 0; i < Integer.parseInt(v.getNum()); i++) {
prizeIdList.add(v.getValue());
}
});
//已经中奖的奖项ID集合
List<String> winPrizeIdList = punchLotteryList.stream().filter(FitnessWalkPunchLottery::getIsWin).map(FitnessWalkPunchLottery::getPrizeId).toList();
winPrizeIdList.forEach(prizeIdList::remove);
Random random = new Random();
if (Lang.isNotEmpty(prizeIdList.size())) {
int index = random.nextInt(prizeIdList.size());
// 获取随机元素
String winingPrizeId = prizeIdList.get(index);
String winingPrizeName = prizeMap.get(winingPrizeId);
punchLottery.setPrizeName(winingPrizeName);
punchLottery.setPrizeId(winingPrizeId);
punchLottery.setIsWin(true);
}
}
fitnessWalkCommonService.dao().insert(punchLottery);
if (punchLottery.getIsWin()) {
return Result.success().addData(punchLottery.getPrizeId());
} else {
return Result.success().addData(null);
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (lock.isLocked()) {
lock.unlock();
}
}
}
@At
@ApiOperation("获取中奖记录")
public Result getLotteryRecord(String activityId, String userId) {
List<FitnessWalkPunchLottery> list = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class, Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));
return Result.success(list);
}
/**
* 兑奖
*
* @param id
* @return
*/
@At
@ApiOperation("兑奖")
public Result doExchange(String id) {
int count = fitnessWalkCommonService.dao().count(FitnessWalkPunchLottery.class, Cnd.where("id", "=", id).and("isExchange", "=", 1));
//返回2 "该二维码已兑奖!"
if (count > 0) {
return Result.success(2);
}
int update = fitnessWalkCommonService.dao().update(FitnessWalkPunchLottery.class,
Chain.make("isExchange", 1).add("exchangeDate", new Date()),
Cnd.where("id", "=", id));
return update > 0 ? Result.success() : Result.error();
}
/**
* 改为已读
*
* @param activityId
* @param userId
* @return
*/
@At
@ApiOperation("改为已读")
public Result doReadLottery(String activityId, String userId) {
fitnessWalkCommonService.dao().update(FitnessWalkPunchLottery.class, Chain.make("isRead", 1),
Cnd.where("userId", "=", userId).and("activityId", "=", activityId));
return Result.success();
}
/**
* 查看获奖人员
*
* @return
*/
@At
@ApiOperation("查看获奖人员")
public Result getPunchWining(String activityId) {
List<FitnessWalkPunchLottery> punchLotteryList = fitnessWalkCommonService.dao().query(FitnessWalkPunchLottery.class,
Cnd.where("isWin", "=", 1).and("activityId", "=", activityId));
return Result.success(punchLotteryList);
}
/**
* 抽奖方法的工具类,生成随机数,该随机数为中奖人
*
* @param minNum 最小值
* @param maxNum 最多抽取多少人
* @param count 抽几个
* @return
*/
public List<Integer> generateRandomNumber(Integer minNum, Integer maxNum, Integer count) {
Set<Integer> randomNumbers = new HashSet<>();
Random rand = new Random();
//如果是 抽奖人数小于了 奖品数量,会陷入死循环
if (maxNum <= count) {
for (int i = 0; i <= maxNum; i++) {
randomNumbers.add(i + 1);
}
} else {
while (randomNumbers.size() < count) {
int randomNum = rand.nextInt(maxNum - minNum + 1) + minNum;
randomNumbers.add(randomNum);
}
}
return new ArrayList<>(randomNumbers);
}
}
@@ -0,0 +1,247 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkPunchStatisticsService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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 javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* 打卡统计
*/
@IocBean
@Ok("json")
@ApiOperation("健步走打卡统计")
@At("/platform/fitnessWalk/punchStatistics")
public class FitnessWalkPunchStatisticsController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private FitnessWalkPunchStatisticsService fitnessWalkPunchStatisticsService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/punchStatistics.html")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void index() {
}
/**
* 分工会统计
*
* @param activityId
* @param unionId
* @return
*/
@At
@Ok("json:full")
@ApiOperation("打卡记录统计")
@SaCheckPermission("fitnessWalk.punchStatistics")
public Result pageData(String activityId, String unionId) {
List<NutMap> list = fitnessWalkPunchStatisticsService.unionRegCheckInNum(activityId, unionId);
return Result.success(list);
}
@At
@ApiOperation("获取活动列表")
@SaCheckPermission("fitnessWalk.punchStatistics")
public Result getCascadersActivity(@Param("year") int year) {
return Result.success().addData(fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.PUNCH));
}
@At
@Ok("json:full")
@ApiOperation("根据工会查询获取报名人员")
@SaCheckPermission("fitnessWalk.punchStatistics")
public Result unionRegistrationData(String activityId, String unionId) {
List<JSONObject> list = fitnessWalkPunchStatisticsService.unionRegistrationData(activityId, unionId);
return Result.success(list);
}
@At
@Ok("json:full")
@ApiOperation("根据工会查询获取打卡人员")
@SaCheckPermission("fitnessWalk.punchStatistics")
public Result unionCheckInData(String activityId, String unionId) {
List<JSONObject> list = fitnessWalkPunchStatisticsService.unionCheckInData(activityId, unionId);
return Result.success(list);
}
@At
@Ok("void")
@ApiOperation("导出各分工会报名人数、打卡人数")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void exportUnionRegCheckInNum(HttpServletResponse response, String activityId) {
List<NutMap> list = fitnessWalkPunchStatisticsService.unionRegCheckInNum(activityId, null);
List<ExcelExportEntity> entities = new ArrayList<>();
entities.add(new ExcelExportEntity("分工会", "unionname", 20));
entities.add(new ExcelExportEntity("报名人数", "regCount", 20));
entities.add(new ExcelExportEntity("打卡人数", "checkInCount", 20));
try {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entities, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("各分工会统计人数.xlsx", workbook, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@At
@Ok("void")
@ApiOperation("导出某个分工会的报名人员")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void exportRegUsers(HttpServletResponse response, String activityId, String unionId) {
Sys_union union = dao.fetch(Sys_union.class, unionId);
String unionName = Optional.ofNullable(union).map(Sys_union::getName).orElse(null);
List<JSONObject> list = fitnessWalkPunchStatisticsService.unionRegistrationData(activityId, unionId);
List<ExcelExportEntity> entities = new ArrayList<>();
entities.add(new ExcelExportEntity("工号", "loginname", 20));
entities.add(new ExcelExportEntity("姓名", "username", 20));
entities.add(new ExcelExportEntity("单位", "unitname", 20));
entities.add(new ExcelExportEntity("手机号", "mobile", 20));
entities.add(new ExcelExportEntity("报名时间", "register_time_str", 20));
try {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entities, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("分工会报名人员.xlsx", workbook, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@At
@Ok("void")
@ApiOperation("导出某个分工会的打卡人员")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void exportCheckInUsers(HttpServletResponse response, String activityId, String unionId) {
Sys_union union = dao.fetch(Sys_union.class, unionId);
String unionName = Optional.ofNullable(union).map(Sys_union::getName).orElse(null);
List<JSONObject> list = fitnessWalkPunchStatisticsService.unionCheckInData(activityId, unionId);
for (JSONObject jsonObject : list) {
Boolean used = jsonObject.getBool("used");
if (used == null) {
jsonObject.put("used", "未取得");
} else if (used) {
jsonObject.put("used", "已领取");
} else {
jsonObject.put("used", "未领取");
}
}
List<ExcelExportEntity> entities = new ArrayList<>();
entities.add(new ExcelExportEntity("工号", "loginname", 20));
entities.add(new ExcelExportEntity("姓名", "username", 20));
entities.add(new ExcelExportEntity("单位", "unitname", 20));
entities.add(new ExcelExportEntity("手机号", "mobile", 20));
entities.add(new ExcelExportEntity("点位总数", "pts_size", 20));
entities.add(new ExcelExportEntity("已打卡点位数", "sign_size", 20));
entities.add(new ExcelExportEntity("礼品券", "used", 20));
try {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entities, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download(unionName + "分工会报名人员.xlsx", workbook, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// /**
// * 导出礼品领取情况
// * @param response
// * @param activityId
// * @param unionId 工会id
// * @param used
// */
// @At
// @Ok("void")
// public void exportGiftInfo(HttpServletResponse response, String activityId, String unionId, boolean used) {
//
//
//
// }
@At
@Ok("void")
@ApiOperation("导出未领取得奖品券用户")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void exportNotGetGiftVoucherUsers(HttpServletResponse response, String activityId) {
List<JSONObject> list = fitnessWalkPunchStatisticsService.exportNotGetGiftVoucherUsers(activityId);
List<ExcelExportEntity> entities = new ArrayList<>();
entities.add(new ExcelExportEntity("工号", "loginname", 20));
entities.add(new ExcelExportEntity("姓名", "username", 20));
entities.add(new ExcelExportEntity("单位", "unitname", 20));
entities.add(new ExcelExportEntity("手机号", "mobile", 20));
try {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entities, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("未领取得奖品券人员.xlsx", workbook, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@At
@Ok("void")
@ApiOperation("导出未使用奖品券用户")
@SaCheckPermission("fitnessWalk.punchStatistics")
public void exportNotUseGiftVoucherUsers(HttpServletResponse response, String activityId) {
List<JSONObject> list = fitnessWalkPunchStatisticsService.exportNotUseGiftVoucherUsers(activityId);
List<ExcelExportEntity> entities = new ArrayList<>();
entities.add(new ExcelExportEntity("工号", "loginname", 20));
entities.add(new ExcelExportEntity("姓名", "username", 20));
entities.add(new ExcelExportEntity("单位", "unitname", 20));
entities.add(new ExcelExportEntity("手机号", "mobile", 20));
try {
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entities, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("导出未使用礼品券用户.xlsx", workbook, response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -0,0 +1,403 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkStep;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import com.budwk.app.zhgh.integral.model.IntegralDetail;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.integration.jedis.RedisService;
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.Lang;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
@IocBean
@Ok("json")
@ApiOperation("健步走步数管理")
@At("/platform/fitnessWalk/stepManage")
public class FitnessWalkStepManageController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private RedisService redisService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
/**
* 用户上传一个近31天的步数
*
* @param activityId 活动id
* @param userId 用户id
* @param monthSteps 步数(当天往前推30天)
* @return
*/
@At
@Ok("json:full")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "健步走步数管理", msg = "微信步数上传")
@ApiOperation("上传微信步数,再根据是否开启了积分,自动将步数转化成积分")
public Result updateStepMonth(String activityId, String userId, String monthSteps) {
try {
if (StrUtil.isBlank(userId) || StrUtil.isBlank(monthSteps) || StrUtil.isBlank(activityId)) {
return Result.error("必要参数未传递");
}
// 健步走的活动数据
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
// 是否启用了积分
boolean isPoints = activity.getIsPoints() != null && activity.getIsPoints();
// 使用对象解构获取活动参数
final Integer standSteps = activity.getLotteryQualificationSteps();
final Integer standPoints = activity.getLotteryQualificationPoints();
final Integer otherSteps = activity.getOtherSteps();
final Integer otherPoints = activity.getOtherPoints();
final Integer maxPoints = activity.getMaxPoints();
String integralNotes = activity.getMasterActivityName() + "所获积分";
// 获取到的用户的步数数据
List<NutMap> steps = Json.fromJsonAsList(NutMap.class, monthSteps);
//判断数据是否完整 微信运动会在晚上10点多进行步数的更新 会导致31天前的步数获取变为0 所以这里去除掉第一个元素 即为31天前的数据 每次只保存最近30天的数据
if (Lang.isNotEmpty(steps) && steps.size() == 31) {
steps.remove(0);
}
// 传递过来的步数数据
List<FitnessWalkStep> wxSteps = steps.stream().map(v -> {
FitnessWalkStep step = new FitnessWalkStep();
step.setActivityId(activityId);
step.setUserId(userId);
step.setStep(v.getInt("step"));
// 计算积分,判断有没有设置,超过达标步数后,每达标XX步数,获得XX积分
int calculatedPoints = calculatePoints(isPoints, standSteps, standPoints, otherSteps, otherPoints, maxPoints, step.getStep());
step.setPoints(calculatedPoints);
DateTime date = DateUtil.parse(DateUtil.format(DateUtil.date(v.getLong("timestamp") * 1000), "yyyy-MM-dd"), "yyyy-MM-dd");
step.setApplyDate(date);
return step;
}).toList();
// 传递过来的所有日期的集合
List<Date> dateList = wxSteps.stream().map(FitnessWalkStep::getApplyDate).collect(Collectors.toList());
// 去数据库查询日期,这个玩意还要保证插入到数据库的单个日期只有一条,并且这个日期数据库之前有步数,传过来没步数那就要保留数据库的步数
// 上面日期集合数据库的步数
List<FitnessWalkStep> stepList = dao.query(FitnessWalkStep.class, Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId).and("applyDate", "in", dateList));
// 这就是保留每天最大步数的集合,那这个集合里面applyDate就是唯一的了
List<FitnessWalkStep> dupStepList = new ArrayList<>(stepList.stream()
.collect(Collectors.toMap(FitnessWalkStep::getApplyDate, Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(FitnessWalkStep::getStep))))
.values());
// 这是过滤的相同的applyDate的集合,这些数据要删除
List<String> delStepIds = stepList.stream()
.filter(step -> !dupStepList.contains(step))
.map(FitnessWalkStep::getId)
.collect(Collectors.toList());
// 数据库的数据 这个map就用于判断数据库的日期和传递过来日期的步数,两个是不是相等的,保留步数多的数据
Map<Date, FitnessWalkStep> dateStepMap = dupStepList.stream().collect(Collectors.toMap(FitnessWalkStep::getApplyDate, v -> v));
List<FitnessWalkStep> resultStepList = new ArrayList<>();
// 这里循环就是,循环的传递过来的数据
for (FitnessWalkStep step : wxSteps) {
// 数据库存储的步数
FitnessWalkStep walkStep = dateStepMap.get(step.getApplyDate());
// 如果数据库没有,那就要新增
if (Lang.isEmpty(walkStep)) {
resultStepList.add(step);
} else {
// 如果数据库有,那就要保留步数多的
if (walkStep.getStep() < step.getStep()) {
walkStep.setStep(step.getStep());
resultStepList.add(walkStep);
}
}
}
// 最后删除重复日期,更新步数数据
if (Lang.isNotEmpty(delStepIds)) {
dao.clear(FitnessWalkStep.class, Cnd.where("id", "in", delStepIds));
if (standSteps != null && standSteps > 0) {
// 删除积分明细
dao.clear(IntegralDetail.class, Cnd.where("id", "in", delStepIds));
}
}
if (Lang.isNotEmpty(resultStepList)) {
dao.insertOrUpdate(resultStepList);
if (standSteps != null && standSteps > 0) {
// 增加积分明细
int year = DateUtil.thisYear();
List<IntegralDetail> integralDetailList = resultStepList.stream().map(v -> {
IntegralDetail detail = new IntegralDetail();
detail.setId(v.getId());
detail.setYear(String.valueOf(year));
detail.setUserId(userId);
detail.setIntegral(String.valueOf(v.getPoints()));
detail.setIntegralNotes(integralNotes);
detail.setBizId(activityId);
detail.setIntegralTime(v.getApplyDate());
return detail;
}).toList();
List<IntegralDetail> list = integralDetailList.stream().filter(v -> !"0".equals(v.getIntegral())).toList();
if (Lang.isNotEmpty(list)) {
dao.insertOrUpdate(list);
}
}
}
return Result.success();
} catch (Exception e){
e.printStackTrace();
return Result.error("步数上传失败,请稍后重试,必要时请及时联系管理员");
}
}
/**
* 小程序获取开始时间至今的步数
*
* @param activityId
* @param userId
* @return
*/
@At
@Ok("json:full")
@ApiOperation("小程序获取开始时间至今的步数")
public Result getActivityDateStep(String activityId, String userId) {
try {
Cnd cnd = Cnd.NEW();
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
DateTime startTime = DateUtil.date(activity.getStartTime());
DateTime endTime = DateUtil.date(activity.getEndTime());
cnd.and("activityId", "=", activityId);
cnd.and("userId", "=", userId);
cnd.and("applyDate", ">=", startTime);
cnd.and("applyDate", "<=", endTime);
cnd.asc("applyDate");
cnd.groupBy("applyDate");
List<FitnessWalkStep> stepList = baseService.dao().query(FitnessWalkStep.class, cnd);
List<Map<String, ? extends Number>> collect = stepList.stream().map(v -> {
return Map.of("step", v.getStep(), "timestamp", v.getApplyDate().getTime());
}).collect(Collectors.toList());
return Result.success().addData(collect);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
@At
@Ok("json:full")
@ApiOperation("获取活动达标的进度条")
public Result getActivityQualifyProgressBar(String activityId, String userId) {
NutMap resultMap = NutMap.NEW();
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
//计步的抽奖模式 everyday custom
String lotteryMode = activity.getLotteryMode();
if ("everyday".equals(lotteryMode)) {
FitnessWalkActivity.DayLotteryRule dayLotteryRule = activity.getDayLotteryRule();
//每日抽奖资格步数
Integer lotteryQualificationStep = dayLotteryRule.getLotteryQualificationStep();
FitnessWalkStep userWalkStep = baseService.dao().fetch(FitnessWalkStep.class, Cnd.where("userId", "=", userId)
.and("DATE( applyDate )", "=", DateUtil.today()).and("activityId", "=", activityId));
int complianceDay = baseService.dao().count(FitnessWalkStep.class, Cnd.where("userId", "=", userId)
.and("DATE( applyDate )", "=", DateUtil.today()).and("activityId", "=", activityId)
.and("step", ">", lotteryQualificationStep));
// 今天的步数
Integer thisDayStep = userWalkStep.getStep();
// 去计算达标的百分比
BigDecimal lotteryQualificationStepBig = new BigDecimal(lotteryQualificationStep);
BigDecimal thisDayStepBig = new BigDecimal(thisDayStep);
//达标的小数,保留四位
BigDecimal divide = thisDayStepBig.divide(lotteryQualificationStepBig, 4, RoundingMode.HALF_UP);
BigDecimal percentValue = divide.multiply(new BigDecimal("100"));
// 格式化为两位小数
DecimalFormat decimalFormat = new DecimalFormat("#.##");
//百分数
String formattedPercent = decimalFormat.format(percentValue);
long betweenDay = DateUtil.date(activity.getStartTime()).between(DateUtil.date(activity.getEndTime()), DateUnit.DAY);
NutMap map = new NutMap();
map.setv("mode", "everyDayLottery");
//当前达标步数
map.setv("userStep", thisDayStep);
//达标总步数
map.setv("complianceSumStep", lotteryQualificationStep);
//达标比例
map.setv("complianceProportion", Integer.parseInt(formattedPercent));
//活动天数
map.setv("betweenDay", betweenDay);
//达标天数
map.setv("complianceDay", complianceDay);
resultMap.addv("everyDayLotteryMode", map);
} else if ("custom".equals(lotteryMode)) {
List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = activity.getCustomLotteryRules();
List<FitnessWalkStep> userWalkSteps = baseService.dao().
query(FitnessWalkStep.class, Cnd.where("userId", "=", userId)
.and("activityId", "=", activityId)
.and("DATE(applyDate)", ">=", DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"))
.and("DATE(applyDate)", "<=", DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"))
);
List<NutMap> result = new ArrayList<>();
for (FitnessWalkActivity.CustomLotteryRule rule : customLotteryRules) {
NutMap nutMap = NutMap.NEW();
List<FitnessWalkStep> partSteps = userWalkSteps.stream()
.filter(s -> (DateUtil.compare(s.getApplyDate(), rule.getStartDate()) >= 0 && DateUtil.compare(s.getApplyDate(), rule.getEndDate()) <= 0))
.toList();
Integer lotteryQualificationDay = rule.getLotteryQualificationDay();
Integer lotteryQualificationStep = rule.getLotteryQualificationStep();
if (lotteryQualificationDay != null && lotteryQualificationStep != null) {
//每天步数
nutMap.put("mode", "customLotteryEveryDayStepMode");
//用户总达标步数
nutMap.put("userSumStep", partSteps.stream().filter(s -> DateUtil.compare(s.getApplyDate(), new Date(), "yyyy-MM-dd") == 0).findFirst().map(s -> s.getStep()).orElse(0));
//今天达标步数
nutMap.put("complianceStep", lotteryQualificationStep);
//总达标步数
nutMap.put("complianceSumStep", lotteryQualificationDay * lotteryQualificationStep);
//用户当前达标总天数
nutMap.put("userComplianceSumDay", partSteps.stream().filter(s -> s.getStep() > lotteryQualificationStep).count());
//总达标天数
nutMap.put("complianceSumDay", lotteryQualificationDay);
} else if (lotteryQualificationDay == null && lotteryQualificationStep != null) {
//总步数
nutMap.put("mode", "customLotterySumStepMode");
//用户总达标步数
nutMap.put("userSumStep", partSteps.stream().mapToInt(FitnessWalkStep::getStep).sum());
//总达标步数
nutMap.put("complianceSumStep", lotteryQualificationStep);
nutMap.put("title", DateUtil.format(rule.getStartDate(), "MM月dd日") + "" + DateUtil.format(rule.getEndDate(), "MM月dd日"));
}
result.add(nutMap);
}
resultMap.addv("customLotteryMode", result);
}
return Result.success().addData(resultMap);
}
/**
* 获取用户未读的奖
*
* @param activityId
* @param userId
* @return
*/
@At
@Ok("json:full")
@ApiOperation("获取用户未读的奖")
public Result winningRecord(String activityId, String userId) {
Sql sql = Sqls.create("""
select awardName,startDate,endDate from fitness_walk_award_user where activityId=@activityId and userId=@userId and isRead=@isRead
""").setParam("activityId",activityId).setParam("userId", userId).setParam("isRead",true);
/* List<FitnessWalkAwardUser> awardUsers = baseService.dao().query(FitnessWalkAwardUser.class,
Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId).and("isRead", "=", true));*/
return Result.success(baseService.listMap(sql));
}
/**
* 计算积分
* @param isPointsEnabled
* @param standSteps
* @param standPoints
* @param otherSteps
* @param otherPoints
* @param maxPoints
* @param actualSteps
* @return
*/
private int calculatePoints(boolean isPointsEnabled,
Integer standSteps, Integer standPoints,
Integer otherSteps, Integer otherPoints,
Integer maxPoints, int actualSteps) {
// 基础条件检查
if (!isPointsEnabled || standSteps == null || standPoints == null || actualSteps < standSteps) {
return 0;
}
// 计算基础积分
int totalPoints = standPoints;
// 计算额外积分
if (hasExtraPoints(otherSteps, otherPoints)) {
int extraSteps = actualSteps - standSteps;
int extraPoints = (extraSteps / otherSteps) * otherPoints;
totalPoints += extraPoints;
}
// 应用积分上限
if (hasMaxPointsLimit(maxPoints)) {
return Math.min(totalPoints, maxPoints);
}
return totalPoints;
}
/**
* 检查是否有额外积分规则
*/
private boolean hasExtraPoints(Integer otherSteps, Integer otherPoints) {
return otherSteps != null && otherPoints != null && otherSteps > 0 && otherPoints > 0;
}
/**
* 检查是否有积分上限
*/
private boolean hasMaxPointsLimit(Integer maxPoints) {
return maxPoints != null && maxPoints > 0;
}
}
@@ -0,0 +1,285 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
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 cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkRaffleRules;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkRaffleUser;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkStepRaffleService;
import com.budwk.app.zhgh.integral.model.IntegralDetail;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
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 javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleController
* @Date 2024/12/27 14:43
* @注释 健步走抽奖控制器
*/
@IocBean
@Ok("json")
@ApiOperation("健步走手动抽奖")
@At("/platform/fitnessWalk/stepRaffle")
public class FitnessWalkStepRaffleController {
@Inject
private Dao dao;
@Inject
private BaseService baseService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@Inject
private FitnessWalkStepRaffleService fitnessWalkStepRaffleService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/stepRaffle.html")
@SaCheckPermission("fitnessWalk.stepRaffle")
public void index() {
}
@At
@ApiOperation("获取抽奖列表")
@SaCheckPermission("fitnessWalk.stepRaffle")
public Result pageData(PageForm pageForm,
@Param("activityId") String activityId,
@Param("unionId") String unionId,
@Param("unitId") String unitId){
Sql sql = fitnessWalkStepRaffleService.getRaffleSql(pageForm, activityId, unionId, unitId);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("获取活动级联数据")
@SaCheckPermission("fitnessWalk.stepRaffle")
public Result getCascadersActivity(@Param("year") int year) {
return Result.success().addData(fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.STEP_COUNT));
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("设置抽奖规则,并抽奖")
@SLog(tag = "健步走手动抽奖", msg = "设置抽奖规则并抽奖")
@SaCheckPermission("fitnessWalk.stepRaffle")
public Result saveRaffle(FitnessWalkRaffleRules fitnessWalkRaffleRules){
baseService.dao().insertOrUpdate(fitnessWalkRaffleRules);
fitnessWalkStepRaffleService.manualLottery(fitnessWalkRaffleRules.getActivityId());
return null;
}
@At
@ApiOperation("获取抽奖规则")
@SaCheckPermission("fitnessWalk.stepRaffle")
public Result getRaffle(String activityId){
FitnessWalkRaffleRules raffleRules = baseService.dao().fetch(FitnessWalkRaffleRules.class, Cnd.where("activityId", "=", activityId));
return Result.success().addData(raffleRules);
}
/**
* 小程序获取奖项信息
* @param activityId
* @return
*/
@At
@ApiOperation("小程序获取奖项信息")
public Result getAwardList(String activityId){
List<NutMap> activityAwardList = fitnessWalkStepRaffleService.getActivityAwardList(activityId);
return Result.success().addData(activityAwardList);
}
/**
* 小程序获取自己的中奖信息
* @return
*/
@At
@ApiOperation("小程序获取自己的中奖信息")
public Result getAwardInfo(String activityId, String userId){
Dao dao = fitnessWalkStepRaffleService.dao();
FitnessWalkAwardUser awardUser = dao.fetch(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
FitnessWalkRaffleUser raffleUser = dao.fetch(FitnessWalkRaffleUser.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
NutMap map = NutMap.NEW();
if (Lang.isNotEmpty(raffleUser) && !raffleUser.getIsRaffle()) {
if (Lang.isNotEmpty(awardUser)) {
map.put("awardName", awardUser.getAwardName());
} else {
map.put("awardName", "没有中奖");
}
map.put("raffleNum", 1);
} else {
map.put("raffleNum", 0);
}
return Result.success().addData(map);
}
/**
* 小程序获取查询是否可以抽奖
* @return
*/
@At
@ApiOperation("小程序获取查询是否可以抽奖")
public Result checkRaffle(String activityId, String userId){
Dao dao = fitnessWalkStepRaffleService.dao();
FitnessWalkRaffleUser raffleUser = dao.fetch(FitnessWalkRaffleUser.class,
Cnd.where("activityId", "=", activityId)
.and("userId", "=", userId));
if (Lang.isNotEmpty(raffleUser)) {
return raffleUser.getIsRaffle() ? Result.error() : Result.success();
} else {
return Result.error();
}
}
/**
* 抽奖成功后,修改数据库状态
* @param activityId
* @param userId
* @return
*/
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("抽奖成功后,修改数据库状态")
@SLog(tag = "健步走手动抽奖", msg = "抽奖成功后,修改数据库状态")
public Result updateUserAward(String activityId, String userId) {
fitnessWalkStepRaffleService.dao().update(FitnessWalkAwardUser.class,
Chain.make("isRead", true).add("applyDate", DateUtil.date()),
Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
fitnessWalkStepRaffleService.dao().update(FitnessWalkRaffleUser.class,
Chain.make("isRaffle", true),
Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
// 增加积分
FitnessWalkAwardUser awardUser = dao.fetch(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId).and("userId", "=", userId));
IntegralDetail detail = new IntegralDetail();
detail.setId(awardUser.getId());
detail.setYear(String.valueOf(DateUtil.thisYear()));
detail.setUserId(awardUser.getUserId());
detail.setIntegral(String.valueOf(awardUser.getPoints()));
detail.setIntegralNotes(awardUser.getAwardName());
detail.setBizId(awardUser.getId());
detail.setIntegralTime(DateUtil.date());
dao.insert(detail);
return null;
}
@At
@Ok("void")
@ApiOperation("导出中奖名单")
@SaCheckPermission("fitnessWalk.stepRaffle")
public void exportAwardExcel(String searchKeyword, String activityId,
String lotteryTime, HttpServletResponse response) {
Cnd cnd = Cnd.NEW();
cnd.andEX("activityId", "=", activityId);
cnd.andEX("awardName", "=", lotteryTime);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", searchKeyword);
seg.orLike("loginName", searchKeyword);
cnd.and(seg);
}
cnd.and("isRead", "=", true);
List<FitnessWalkAwardUser> list = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class, cnd);
for (FitnessWalkAwardUser awardUser : list) {
awardUser.setApplyDate(awardUser.getApplyDate());
}
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionName", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 40));
entityList.add(new ExcelExportEntity("奖项名称", "awardName", 20));
entityList.add(new ExcelExportEntity("中奖时间", "applyDate2", 20));
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("健步走中奖人员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@ApiOperation("导出健步走达标人员名单")
@SaCheckPermission("fitnessWalk.stepRaffle")
public void exportExcel(String searchKeyword, String activityId, String unionId,
String unitId, HttpServletResponse response) {
PageForm pageForm = new PageForm();
pageForm.setSearchKeyword(searchKeyword);
Sql sql = fitnessWalkStepRaffleService.getRaffleSql(pageForm, activityId, unionId, unitId);
List<NutMap> list = fitnessWalkStepRaffleService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("工号", "loginname", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionname", 20));
entityList.add(new ExcelExportEntity("单位", "unitname", 40));
entityList.add(new ExcelExportEntity("达标天数", "standardsDays", 20));
entityList.add(new ExcelExportEntity("步数", "total_steps", 20));
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, list);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("健步走达标人员名单.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,274 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
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 cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
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.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 步数排行榜
*/
@Slf4j
@IocBean
@Ok("json")
@ApiOperation("健步走步数排行榜")
@At("/platform/fitnessWalk/stepRanking")
public class FitnessWalkStepRankingController {
@Inject
private BaseService baseService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/stepRanking.html")
@SaCheckPermission("fitnessWalk.stepRanking")
public void index() {
}
@At
@ApiOperation("获取步数排行榜")
@SaCheckPermission("fitnessWalk.stepRanking")
public Result pageData(PageForm pageForm,
@Param("activityId") String activityId,
@Param("unionId") String unionId,
@Param("unitId") String unitId,
@Param("mode") String mode) {
Pagination pagination = fitnessWalkCommonService.getStepRankingPagination(pageForm, activityId, unionId, unitId, mode);
return Result.success().addData(pagination);
}
/**
* 获取所有教工 今天的步数及活动时间范围内的步数
*
* @param activityId
* @param mode day:今天 all:所有
* @return {@link Object}
*/
@At
@Ok("json:full")
@ApiOperation("获取今日步数及活动范围内步数")
@SLog(type = "校工会特色活动", tag = "健身走-计步步数排行榜", msg = "小程序接口(获取今日步数及活动范围内步数)")
public Result getUserStepRanking(String activityId, String mode, Integer pageNumber, Integer pageSize) {
if ("day".equals(mode)) {
Sql sql = Sqls.create("""
SELECT
t.step,
t.applyDate,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate = @today
GROUP BY u.id
ORDER BY t.step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("today", DateUtil.today());
Pagination pagination = baseService.listPageMap(pageNumber, 50, sql);
return Result.success().addData(pagination);
} else if ("week".equals(mode)) {
// 周榜
Date startOfWeek = DateUtil.beginOfWeek(new Date());
Date endOfWeek = DateUtil.endOfWeek(new Date());
Sql sql = Sqls.create("""
SELECT
t.userId,
sum( t.step ) AS step,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate >= @startTime
AND t.applyDate <= @endTime
GROUP BY
t.userId
ORDER BY
step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", startOfWeek);
sql.setParam("endTime", endOfWeek);
Pagination pagination = baseService.listPageMap(pageNumber, 50, sql);
return Result.success().addData(pagination);
} else if ("month".equals(mode)) {
// 月榜
Date firstDayOfMonth = DateUtil.beginOfMonth(new Date());
Date lastDayOfMonth = DateUtil.endOfMonth(new Date());
Sql sql = Sqls.create("""
SELECT
t.userId,
sum( t.step ) AS step,
u.username
FROM
`fitness_walk_step` t
LEFT JOIN sys_user u ON u.id = t.userId
WHERE
t.activityId = @activityId
AND t.applyDate >= @startTime
AND t.applyDate <= @endTime
GROUP BY
t.userId
ORDER BY
step DESC
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", firstDayOfMonth);
sql.setParam("endTime", lastDayOfMonth);
Pagination pagination = baseService.listPageMap(pageNumber, 50, sql);
return Result.success().addData(pagination);
} else if ("all".equals(mode)) {
// 总达标榜
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
DateTime startTime = DateUtil.date(activity.getStartTime());
DateTime endTime = DateUtil.date(activity.getEndTime());
Sql sql = Sqls.create("""
SELECT
SUM(sub.max_step) AS step,
u.username
FROM (
SELECT
userId,
activityId,
applyDate,
MAX(step) AS max_step
FROM
fitness_walk_step
WHERE
activityId = @activityId
AND applyDate >= @startTime AND applyDate <= @endTime
GROUP BY
userId,
activityId,
applyDate
) sub
left join `user` u ON u.id = sub.userId
GROUP BY
userId
ORDER BY
step desc
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", startTime);
sql.setParam("endTime", endTime);
Pagination pagination = baseService.listPageMap(pageNumber, 50, sql);
return Result.success().addData(pagination);
} else if ("points".equals(mode)) {
// 积分榜
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
DateTime startTime = DateUtil.date(activity.getStartTime());
DateTime endTime = DateUtil.date(activity.getEndTime());
Sql sql = Sqls.create("""
SELECT
SUM(sub.max_step) AS step,
u.username
FROM (
SELECT
userId,
activityId,
applyDate,
MAX(points) AS max_step
FROM
fitness_walk_step
WHERE
activityId = @activityId
AND applyDate >= @startTime AND applyDate <= @endTime
GROUP BY
userId,
activityId,
applyDate
) sub
left join `user` u ON u.id = sub.userId
GROUP BY
userId
ORDER BY
step desc
""");
sql.setParam("activityId", activityId);
sql.setParam("startTime", startTime);
sql.setParam("endTime", endTime);
Pagination pagination = baseService.listPageMap(pageNumber, 50, sql);
return Result.success().addData(pagination);
} else {
return null;
}
}
@At
@Ok("void")
@ApiOperation("步数排行榜导出")
@SaCheckPermission("fitnessWalk.stepRanking")
@SLog(type = "校工会特色活动", tag = "健身走-计步步数排行榜", msg = "步数排行榜导出", param = true, result = true)
public void exportExcel(@Param("searchName") String searchName,
@Param("searchKeyword") String searchKeyword,
@Param("activityId") String activityId,
@Param("unionId") String unionId,
@Param("unitId") String unitId,
@Param("mode") String mode,
HttpServletResponse response) {
List<NutMap> stepRankingList = fitnessWalkCommonService.getStepRankingList(searchName, searchKeyword, activityId, unionId, unitId, mode);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("工号", "loginname", 20));
entityList.add(new ExcelExportEntity("分工会", "unionname", 20));
entityList.add(new ExcelExportEntity("单位", "unitname", 20));
entityList.add(new ExcelExportEntity("today".equals(mode) ? "今日步数" : "活动期间总步数", "total_steps", 20));
try {
String title = ("today".equals(mode) ? DateUtil.format(new Date(), "yyyy年MM月dd日") : "活动期间总") + "步数榜.xlsx";
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, stepRankingList);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download(title, workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@ApiOperation("获取联级活动")
@SaCheckPermission("fitnessWalk.stepRanking")
public Result getCascadersActivity(@Param("year") int year) {
return Result.success().addData(fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.STEP_COUNT));
}
}
@@ -0,0 +1,165 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
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 cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
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 javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@IocBean
@Ok("json")
@ApiOperation("计步步数统计")
@At("/platform/fitnessWalk/stepStatistics")
public class FitnessWalkStepStatisticsController {
@Inject
private BaseService baseService;
@Inject
private RedisService redisService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/stepStatistics.html")
@SaCheckPermission("fitnessWalk.stepStatistics")
public void index() {
}
/**
* 公共sql
* @return
*/
private String getSql() {
return """
SELECT
u.loginname,
u.username,
u.unionName AS unionname,
u.unitName AS unitname,
al.applyDate,
al.step,
date_format(al.applyDate,'%Y-%m-%d') as prizeData
FROM
`fitness_walk_step` al
LEFT JOIN `vw_user` u ON u.id = al.userId
$condition
""";
}
@At
@Ok("json:full")
@ApiOperation("计步步数统计")
@SaCheckPermission("fitnessWalk.stepStatistics")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("activityId") String activityId,
@Param("activityDate") String[] activityDate,
@Param("unionId") String unionId,
@Param("unitId") String unitId) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create(getSql());
if (Lang.isNotEmpty(activityDate)) {
cnd.and("date_format(al.applyDate,'%Y-%m-%d')", ">=", activityDate[0]);
cnd.and("date_format(al.applyDate,'%Y-%m-%d')", "<=", activityDate[1]);
}
if(StrUtil.isNotBlank(pageForm.getSearchKeyword())){
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.username",pageForm.getSearchKeyword());
seg.orLike("u.loginname",pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.andEX("YEAR(al.applyDate)", "=", year);
cnd.andEX("al.activityId", "=", activityId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitId", "=", unitId);
cnd.desc("al.applyDate");
cnd.desc("u.unioncode");
cnd.groupBy("al.applyDate", "al.userId");
sql.setCondition(cnd);
Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("获取联级活动")
@SaCheckPermission("fitnessWalk.stepStatistics")
public Result getCascadersActivity(@Param("year") int year) {
return Result.success().addData(fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.STEP_COUNT));
}
@Ok("void")
@At("/exportExcel")
@ApiOperation("计步步数统计表导出")
@SaCheckPermission("fitnessWalk.stepStatistics")
public void exportExcel(@Param("activityId") String activityId,
@Param("activityDate") String[] activityDate,
@Param("unionId") String unionId,
@Param("unitId") String unitId, HttpServletResponse response) {
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create(getSql());
if (activityDate.length > 0) {
cnd.and("date_format(al.applyDate,'%Y-%m-%d')", ">=", activityDate[0]);
cnd.and("date_format(al.applyDate,'%Y-%m-%d')", "<=", activityDate[1]);
}
cnd.andEX("al.activityId", "=", activityId);
cnd.andEX("u.unionid", "=", unionId);
cnd.andEX("u.unitId", "=", unitId);
cnd.desc("al.applyDate");
cnd.desc("u.unioncode");
sql.setCondition(cnd);
List<NutMap> exportList = baseService.listMap(sql);
List<ExcelExportEntity> entityList = new ArrayList<>() {{
add(new ExcelExportEntity("姓名", "username", 20));
add(new ExcelExportEntity("工号", "loginname", 20));
add(new ExcelExportEntity("单位", "unitname", 20));
add(new ExcelExportEntity("分工会", "unionname", 20));
add(new ExcelExportEntity("当前步数", "step", 20));
add(new ExcelExportEntity("日期", "prizeData", 20));
}};
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList, exportList);
workbook.write(response.getOutputStream());
CommonDownloadUtil.download("计步步数统计表.xlsx", workbook, response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,155 @@
package com.budwk.app.zhgh.activity.fitnesswalk.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Cnd;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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 javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 用户中奖榜
*/
@IocBean
@Ok("json")
@ApiOperation("小程序计步步数中奖榜")
@At("/platform/fitnessWalk/stepWining")
public class FitnessWalkStepWiningController {
@Inject
private BaseService baseService;
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
@At("")
@Ok("beetl:/platform/zhgh/activity/fitnesswalk/stepWining.html")
@SaCheckPermission("fitnessWalk.stepWining")
public void index() {
}
/**
* 获取中奖榜
*
* @param activityId
* @return {@link Object}
*/
@At
@Ok("json:full")
@ApiOperation("小程序获取中奖榜")
@SLog(type = "校工会特色活动",tag = "健身走-计步步数中奖榜",msg = "获取中奖榜")
public Result getUserStepWining(String activityId) {
return Result.success().addData(fitnessWalkCommonService.getWiningRankingUserList(activityId));
}
@At
@ApiOperation("获取联级活动")
@SaCheckPermission("fitnessWalk.stepWining")
public Result getCascadersActivity(@Param("year") int year) {
return Result.success().addData(fitnessWalkCommonService.cascaderActivity(year, FitnessWalkMode.STEP_COUNT));
}
@At
@Ok("void")
@ApiOperation("小程序中奖榜导出")
@SaCheckPermission("fitnessWalk.stepWining")
@SLog(type = "校工会特色活动",tag = "健身走-计步步数中奖榜",msg = "导出中奖榜")
public void exportUserStepWining(String activityId, HttpServletResponse response){
List<NutMap> winingRankingUserList = fitnessWalkCommonService.getWiningRankingUserList(activityId);
List<ExcelExportEntity> entityList = new ArrayList<>();
ExcelExportEntity no = new ExcelExportEntity("序号", "no", 10);
no.setFormat("isAddIndex");
entityList.add(no);
entityList.add(new ExcelExportEntity("工号", "loginName", 20));
entityList.add(new ExcelExportEntity("姓名", "username", 20));
entityList.add(new ExcelExportEntity("分工会", "unionName", 20));
entityList.add(new ExcelExportEntity("单位", "unitName", 40));
entityList.add(new ExcelExportEntity("奖项名称", "awardName", 20));
entityList.add(new ExcelExportEntity("步数", "awardSteps", 20));
entityList.add(new ExcelExportEntity("中奖时间", "applyDate", 20));
try {
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("中奖明细.zip", "UTF-8"));
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (NutMap map : winingRankingUserList) {
List<NutMap> awardList = map.getAsList("awardList", NutMap.class);
awardList.forEach(v->v.setv("applyDate",DateUtil.format(v.getTime("applyDate"),"yyyy-MM-dd")));
zipOutputStream.putNextEntry(new ZipEntry(map.getString("title") + ".xlsx"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, awardList);
workbook.write(zipOutputStream);
zipOutputStream.closeEntry();
}
zipOutputStream.flush();
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 中奖奖项列表
*
* @param activityId
* @return
*/
@At
@ApiOperation("小程序获取中奖奖项列表")
public Result prizeOption(String activityId) {
List<NutMap> list = fitnessWalkCommonService.prizeOption(activityId);
return Result.success(list);
}
/**
* 中奖用户
* @param lotteryTime
* @param activityId
* @return
*/
@At
@ApiOperation("小程序获取中奖用户")
public Result prizeUsers(String lotteryTime, String activityId, String searchKeyword) {
Cnd cnd = Cnd.NEW();
cnd.andEX("activityId", "=", activityId);
cnd.andEX("awardName", "=", lotteryTime);
if (StrUtil.isNotBlank(searchKeyword)) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("username", searchKeyword);
seg.orLike("loginName", searchKeyword);
cnd.and(seg);
}
cnd.and("isRead", "=", true);
List<FitnessWalkAwardUser> awardUserList = fitnessWalkCommonService.dao().query(FitnessWalkAwardUser.class, cnd);
return Result.success(awardUserList);
}
}
@@ -0,0 +1,235 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
public class FitnessWalkActivity {
@ApiModelProperty(value = "小程序活动Id")
private String _id;
// 主活动名称
@ApiModelProperty(value = "主活动名称")
private String masterActivityName;
// 分支活动名称
@ApiModelProperty(value = "分支活动名称")
private String branchActivityName;
// 活动地址
@ApiModelProperty(value = "活动地址")
private String address;
@ApiModelProperty(value = "活动礼品")
private String giftName;
@ApiModelProperty(value = "活动分组Id")
private String groupId;
@ApiModelProperty(value = "创建分工会Id")
private String unionId;
@ApiModelProperty(value = "活动模式")
private String activityModel;
@ApiModelProperty(value = "活动报名时间范围,时间戳模式")
private Long[] applyTime;
@ApiModelProperty(value = "活动报名开始时间")
private Long applyStartTime;
@ApiModelProperty(value = "活动报名结束时间")
private Long applyEndTime;
@ApiModelProperty(value = "活动时间范围,时间戳模式")
private Long[] time;
@ApiModelProperty(value = "活动开始时间")
private Long startTime;
@ApiModelProperty(value = "活动结束时间")
private Long endTime;
@ApiModelProperty(value = "活动描述")
private String note;
@ApiModelProperty(value = "活动封面")
private String cover;
@ApiModelProperty(value = "活动临时封面")
private String tempCover;
@ApiModelProperty(value = "是否需要答题")
private Boolean isQuestion;
@ApiModelProperty(value = "答题活动Id")
private String questionId;
@ApiModelProperty(value = "步数模式")
private String speedControlMode;
//打卡完成之后 gift_voucher:礼品券 cert:完赛证书 null啥也不干
@ApiModelProperty(value = "打卡完成之后操作")
private String punchFinishAfter;
//完赛证书
@ApiModelProperty(value = "完赛证书")
private String completionCertificateCover;
//完赛证书临时url
@ApiModelProperty(value = "完赛证书临时url")
private String tempCompletionCertificateCover;
//是否抽奖
@ApiModelProperty(value = "是否抽奖")
private Boolean isLottery;
//打卡模式奖品列表
@ApiModelProperty(value = "打卡完成之后抽奖信息")
private List<PunchLotteryPrize> punchLotteryPrizes;
@ApiModelProperty(value = "是否显示礼品券")
private Boolean showGiftTicket;
@ApiModelProperty(value = "知识卡的图片")
private List<Pts> pts;
@ApiModelProperty(value = "打开点位,线路")
private List<Point> linePoints;
@ApiModelProperty(value = "打开点位,线路2")
private List<Point> linePoints2;
//是否按顺序签到
@ApiModelProperty(value = "是否按顺序签到")
private Boolean isOrderSignIn;
//是否多条线路
@ApiModelProperty(value = "是否多条线路")
private Boolean isMultipleLines;
//抽奖模式 none无 everyday每天 monthly每月 custom自定义
@ApiModelProperty(value = "抽奖模式")
private String lotteryMode;
//每月抽奖模式抽奖时间
@ApiModelProperty(value = "每月抽奖模式抽奖时间")
private List<Date> everyMonthLotteryTime;
@ApiModelProperty(value = "自定义模式抽奖抽奖时间规则")
private List<CustomLotteryRule> customLotteryRules;
@ApiModelProperty(value = "每日模式抽奖抽奖时间规则")
private DayLotteryRule dayLotteryRule;
@ApiModelProperty(value = "随机图片数组")
private List<String> randomPics;
@ApiModelProperty(value = "模板随机图片数组")
private List<String> templateRandomPics;
@ApiModelProperty(value = "外链地址")
private String externalLinkAddress;
@ApiModelProperty(value = "是否开启距离限制")
private Boolean enableDistance;
@ApiModelProperty(value = "签到几个点位算完成")
private Integer finishPointNum;
@ApiModelProperty(value = "是否自动抽奖")
private Boolean isAutoLottery;
@ApiModelProperty(value = "手动抽奖,抽奖资格天数")
private Integer lotteryQualificationDays;
@ApiModelProperty(value = "手动抽奖,抽奖资格步数")
private Integer lotteryQualificationSteps;
@ApiModelProperty(value = "是否启用积分")
private Boolean isPoints;
@ApiModelProperty(value = "达标获得积分")
private Integer lotteryQualificationPoints;
@ApiModelProperty(value = "额外积分的达标步数")
private Integer otherSteps;
@ApiModelProperty(value = "根据额外步数来计算的额外积分")
private Integer otherPoints;
@ApiModelProperty(value = "封顶积分")
private Integer maxPoints;
@Data
public static class Point implements Serializable {
private String type;
private Double[] coordinates;
}
@Data
public static class Pts implements Serializable {
private int code;
private String name;
private int interval;
private List<String> issueIds;
private Point location;
private int radius;
private String tip;
}
/**
* 自定义抽奖规则
*/
@Data
public static class CustomLotteryRule implements Serializable {
//抽奖时间
private Date lotteryTime;
//抽奖从那天开始计算
private Date startDate;
//抽奖截至到哪天
private Date endDate;
//奖项名称
private String awardName;
//抽奖人数
private Integer lotteryUserNum;
//抽奖资格步数
private Integer lotteryQualificationStep;
//抽奖资格天数
private Integer lotteryQualificationDay;
}
/**
* 每日抽奖规则
*/
@Data
public static class DayLotteryRule implements Serializable {
//抽奖资格步数
private Integer lotteryQualificationStep;
//抽奖资格天数
private Integer lotteryQualificationDay;
//抽奖人数
private Integer lotteryUserNum;
//是否可以重复抽奖
private Boolean repeatLottery;
//是否可以增加抽奖机会
private Boolean addLotteryChance;
//每日抽奖模式抽奖时间
private String everyDayLotteryTime;
}
/**
* 打卡抽奖奖品列表
*/
@Data
public static class PunchLotteryPrize implements Serializable{
private String name;
private String value;
private String url;
//份数
private String num;
}
}
@@ -0,0 +1,101 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class FitnessWalkAwardUser extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("活动")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户Id")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("工号")
private String loginName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("姓名")
private String username;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("奖项名称")
private String awardName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("工会id")
private String unionId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("工会名称")
private String unionName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("单位id")
private String unitId;
@Column
@ColDefine(type = ColType.INT)
@Comment("达标天数")
private Integer standardsDays;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("中奖步数")
private String awardSteps;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("单位名称")
private String unitName;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("中奖时间")
private Date applyDate;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已读")
private Boolean isRead;
@Column
@ColDefine(type = ColType.DATE)
@Comment("开始时间")
private Date startDate;
@Column
@ColDefine(type = ColType.DATE)
@Comment("结束时间")
private Date endDate;
@Column
@ColDefine(type = ColType.INT)
@Comment("积分")
private Integer points;
}
@@ -0,0 +1,78 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
@EqualsAndHashCode(callSuper = true)
@Table
@Data
@Comment("打卡模式抽奖记录")
public class FitnessWalkPunchLottery extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动Id")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户Id")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户工号")
private String loginName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("中奖用户")
private String userName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("奖品名称")
private String prizeName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("奖品")
private String prizeId;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否中奖")
private Boolean isWin;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("中奖时间")
private Date winDate;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已读")
private Boolean isRead;
@Column
@ColDefine(type = ColType.DATETIME)
@Comment("兑奖时间")
private Date exchangeDate;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否兑换")
private Boolean isExchange;
}
@@ -0,0 +1,55 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitenssWalkRaffleRules
* @Date 2024/12/28 10:05
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class FitnessWalkRaffleRules extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("活动id")
private String activityId;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("手动抽奖规则")
private List<ManualLotteryRules> manualLotteryRules;
@Data
public static class ManualLotteryRules implements Serializable {
// 奖项名称
private String awardName;
// 奖项积分
private Integer points;
// 抽奖人数
private Integer lotteryUserNum;
// 抽奖类型
private String raffleType;
// 排名位次
private Integer rankingPosition;
// 是否兼得
private Boolean isSimultaneously;
}
}
@@ -0,0 +1,61 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkRaffleUser
* @Date 2024/12/28 17:10
* @注释
*/
@Data
@Table
@EqualsAndHashCode(callSuper = true)
public class FitnessWalkRaffleUser extends BaseModel {
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("活动id")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("用户id")
private String userId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户工号")
private String loginName;
@Column
@ColDefine(type = ColType.VARCHAR, width = 50)
@Comment("用户姓名")
private String username;
@Column
@ColDefine(type = ColType.INT)
@Comment("达标天数")
private Integer standardsDays;
@Column
@ColDefine(type = ColType.VARCHAR, width = 20)
@Comment("中奖步数")
private String awardSteps;
@Column
@ColDefine(type = ColType.BOOLEAN)
@Comment("是否已抽奖")
private Boolean isRaffle;
}
@@ -0,0 +1,50 @@
package com.budwk.app.zhgh.activity.fitnesswalk.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = true)
//@Table("fitness_walk_step_${month}")
@Table
public class FitnessWalkStep extends BaseModel implements Serializable {
private static final long serialVersionUID = 1L;
@Column
@Name
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@ColDefine(type = ColType.VARCHAR)
@Comment("活动id")
private String activityId;
@Column
@ColDefine(type = ColType.VARCHAR, width = 32)
@Comment("姓名Id")
private String userId;
@Column
@ColDefine(customType = "int")
@Comment("步数")
private Integer step;
@Column
@ColDefine(type = ColType.INT)
@Comment("积分")
private Integer points;
@Column
@ColDefine(type = ColType.DATE)
@Comment("时间")
private Date applyDate;
}
@@ -0,0 +1,86 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.Cascader;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface FitnessWalkCommonService extends BaseService<FitnessWalkAwardUser> {
//活动缓存时间
int CACHE_TIME = 7200;
/**
* 活动,从Redis中取
*
* @param activityId 活动id
* @return
*/
FitnessWalkActivity getActivity(String activityId);
/**
* 获取所有活动
*
* @return
*/
List<FitnessWalkActivity> getAllActivity();
/**
* 级联活动
*/
List<Cascader> cascaderActivity(int year, FitnessWalkMode mode);
/**
* 添加活动或修改活动,存放至redis
*
* @param activity 活动
*/
void addOrEditDoSaveRedis(FitnessWalkActivity activity);
/**
* 健身走抽奖模式添加定时抽奖任务
*
* @param fitnessWalkActivity 活动
*/
void addLotteryTask(FitnessWalkActivity fitnessWalkActivity);
/**
* 获取步数排行榜
*
* @param activityId 活动id
* @param unionId 工会id
* @param unitId 单位id
* @param mode today all
* @return
*/
Pagination getStepRankingPagination(PageForm pageForm, String activityId, String unionId, String unitId, String mode);
List<NutMap> getStepRankingList(String searchName, String searchKeyword, String activityId, String unionId, String unitId, String mode);
/**
* 获取中奖榜
*
* @param activityId 活动id
* @return
*/
List<NutMap> getWiningRankingUserList(String activityId);
/**
* 中奖奖项列表
* @param activityId
* @return
*/
List<NutMap> prizeOption(String activityId);
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import org.nutz.lang.util.NutMap;
import java.util.List;
public interface FitnessWalkPunchStatisticsService extends BaseService<FitnessWalkAwardUser> {
List<NutMap> unionRegCheckInNum(String activityId, String unionId);
List<JSONObject> unionRegistrationData(String activityId, String unionId);
List<JSONObject> unionCheckInData(String activityId, String unionId);
List<JSONObject> exportNotGetGiftVoucherUsers(String activityId);
List<JSONObject> exportNotUseGiftVoucherUsers(String activityId);
}
@@ -0,0 +1,34 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkRaffleRules;
import org.nutz.dao.sql.Sql;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleService
* @Date 2024/12/28 11:13
* @注释
*/
public interface FitnessWalkStepRaffleService extends BaseService<FitnessWalkRaffleRules> {
Sql getRaffleSql(PageForm pageForm, String activityId, String unionId, String unitId);
/**
* 获取活动的奖项
* @param activityId
* @return
*/
List<NutMap> getActivityAwardList(String activityId);
/**
* 手动抽奖
* @param activityId 活动id
*/
void manualLottery(String activityId);
}
@@ -0,0 +1,492 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_task;
import com.budwk.app.sys.services.SysTaskService;
import com.budwk.app.task.services.TaskPlatformService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.Cascader;
import com.budwk.app.zhgh.activity.fitnesswalk.contants.FitnessWalkMode;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class FitnessWalkCommonServiceImpl extends BaseServiceImpl<FitnessWalkAwardUser> implements FitnessWalkCommonService {
@Inject
private RedisService redisService;
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Inject
private SysTaskService sysTaskService;
@Inject
private TaskPlatformService taskPlatformService;
public FitnessWalkCommonServiceImpl(Dao dao) {
super(dao);
}
/**
* 活动,从Redis中取
*
* @param activityId 活动id
* @return
*/
@Override
public FitnessWalkActivity getActivity(String activityId) {
if (StrUtil.isBlank(activityId)) {
throw new BaseException("请传递活动");
}
String redisKey = "FitnessWalk:" + activityId;
Boolean exists = redisService.exists("FitnessWalk:" + activityId);
FitnessWalkActivity activity = null;
exists = false;
if (exists) {
String string = redisService.get(redisKey);
activity = JSONUtil.toBean(string, FitnessWalkActivity.class);
if (Lang.isNotEmpty(activity.getRandomPics())) {
List<String> urlStr = new ArrayList<>();
for (String url : activity.getRandomPics()) {
String tempUrl = weAppCloudUtil.httpFile(url);
urlStr.add(tempUrl);
}
activity.setTemplateRandomPics(urlStr);
redisService.set(redisKey, JSONUtil.toJsonStr(activity));
}
if (Strings.isNotBlank(activity.getCover())) {
String tempUrl = weAppCloudUtil.httpFile(activity.getCover());
activity.setTempCover(tempUrl);
}
if(Strings.isNotBlank(activity.getCompletionCertificateCover())){
String tempUrl = weAppCloudUtil.httpFile(activity.getCompletionCertificateCover());
activity.setTempCompletionCertificateCover(tempUrl);
}
} else {
StringBuilder sql = new StringBuilder();
sql.append("db.collection('activity').doc('").append(activityId).append("').get()");
try {
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
activity = jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.toBean((String) v, FitnessWalkActivity.class))
.findFirst().orElse(null);
if (Lang.isNotEmpty(activity.getRandomPics())) {
List<String> urlStr = new ArrayList<>();
for (String url : activity.getRandomPics()) {
String tempUrl = weAppCloudUtil.httpFile(url);
urlStr.add(tempUrl);
}
activity.setTemplateRandomPics(urlStr);
}
if (Strings.isNotBlank(activity.getCover())) {
String tempCover = weAppCloudUtil.httpFile(activity.getCover());
activity.setTempCover(tempCover);
}
if(Strings.isNotBlank(activity.getCompletionCertificateCover())){
String tempUrl = weAppCloudUtil.httpFile(activity.getCompletionCertificateCover());
activity.setTempCompletionCertificateCover(tempUrl);
}
redisService.setex(redisKey, CACHE_TIME, JSONUtil.toJsonStr(activity));
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("获取数据异常!");
}
}
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name(), RoleConstant.BRANCH_UNION_ADMIN.name())
&& !AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
return SecurityUtil.getUnionId().equals(activity.getUnionId()) ? activity : null;
}
return activity;
}
@Override
public List<FitnessWalkActivity> getAllActivity() {
List<FitnessWalkActivity> fitnessWalkActivities;
if (redisService.exists("FitnessWalk:ActivityList")) {
String dataString = redisService.get("FitnessWalk:ActivityList");
fitnessWalkActivities = JSONUtil.toList(dataString, FitnessWalkActivity.class);
} else {
StringBuilder sql = new StringBuilder();
sql.append("db.collection('activity').field({")
.append("masterActivityName:true,")
.append("branchActivityName:true,")
.append("activityModel:true,")
.append("endTime:true,")
.append("startTime:true,")
.append("unionId:true")
.append("}).orderBy('startTime', 'desc').get()");
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.QUERY, sql.toString());
fitnessWalkActivities = jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.toBean((String) v, FitnessWalkActivity.class)).collect(Collectors.toList());
}
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_OPERATOR.name(), RoleConstant.BRANCH_UNION_ADMIN.name())
&& !AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
fitnessWalkActivities = fitnessWalkActivities.stream()
.filter(v -> SecurityUtil.getUnionId().equals(v.getUnionId()))
.collect(Collectors.toList());
}
redisService.set("FitnessWalk:ActivityList", JSONUtil.toJsonStr(fitnessWalkActivities));
return fitnessWalkActivities;
}
@Override
public List<Cascader> cascaderActivity(int year, FitnessWalkMode mode) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
long startTs = DateUtil.beginOfYear(calendar.getTime()).getTime();
long endTs = DateUtil.endOfYear(calendar.getTime()).getTime();
List<Cascader> cascaders = this.getAllActivity().stream()
.filter(v -> v.getActivityModel().equals(mode.getValue()) && v.getStartTime() >= startTs && v.getStartTime() <= endTs)
.collect(Collectors.groupingBy(FitnessWalkActivity::getMasterActivityName))
.entrySet().stream()
.map(entry -> {
Cascader cascader = new Cascader();
cascader.setValue(entry.getValue().stream().findFirst().map(FitnessWalkActivity::get_id).orElse(null));
cascader.setLabel(entry.getKey());
if (entry.getValue().size() > 1) {
List<Cascader> children = entry.getValue().stream().map(z -> {
Cascader cascader2 = new Cascader();
cascader2.setLabel(z.getBranchActivityName());
cascader2.setValue(z.get_id());
return cascader2;
}).collect(Collectors.toList());
cascader.setChildren(children);
}
return cascader;
})
.collect(Collectors.toList());
return cascaders;
}
@Override
public void addOrEditDoSaveRedis(FitnessWalkActivity activity) {
redisService.del("FitnessWalk:" + activity.get_id());
redisService.del("FitnessWalk:ActivityList");
redisService.set("FitnessWalk:" + activity.get_id(), JSONUtil.toJsonStr(activity));
}
@Override
public void addLotteryTask(FitnessWalkActivity fitnessWalkActivity) {
//删除和该活动关联的定时任务
List<Sys_task> oldTasks = sysTaskService.dao().query(Sys_task.class, Cnd.where("data", "like", "%" + fitnessWalkActivity.get_id() + "%"));
for (Sys_task task : oldTasks) {
taskPlatformService.delete(task.getId(), task.getId());
sysTaskService.delete(task.getId());
}
if ("everyday".equals(fitnessWalkActivity.getLotteryMode())) {
FitnessWalkActivity.DayLotteryRule dayLotteryRule = fitnessWalkActivity.getDayLotteryRule();
if (Lang.isNotEmpty(dayLotteryRule)) {
//每日抽奖时间
String lotteryTime = dayLotteryRule.getEveryDayLotteryTime();
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
Date timeDate = null;
try {
timeDate = timeFormat.parse(lotteryTime);
} catch (ParseException e) {
throw new RuntimeException(e);
}
String cron = timeDate.getSeconds() + " " + timeDate.getMinutes() + " " + timeDate.getHours() + " * * ?";
try {
List<String> cronExeTimes = taskPlatformService.getCronExeTimesPlus(cron);
if (CollectionUtil.isNotEmpty(cronExeTimes)) {
//调用类
String jobClass = "io.v.nutz.task.job.fitnessWalk.FitnessWalkLotteryJob";
HashMap<String, Object> map = new HashMap<>(5);
map.put("id", fitnessWalkActivity.get_id());
// 唯一标识的删除id,用于执行定时任务完成后,将此定时任务禁用
map.put("deleteId", R.UU32());
//每天抽奖达标步数
map.put("lotteryQualificationStep", dayLotteryRule.getLotteryQualificationStep().toString());
//每天抽奖人数
map.put("lotteryUserNum", dayLotteryRule.getLotteryUserNum().toString());
//抽奖模式
map.put("mode", "everyday");
// 设置定时任务
Sys_task task = new Sys_task();
task.setName(fitnessWalkActivity.getMasterActivityName() + "健步走计步模式每日抽奖任务");
task.setJobClass(jobClass);
task.setNote("健步走计步模式每日抽奖任务");
task.setCron(cron);
task.setData(Json.toJson(map));
task.setDisabled(false);
sysTaskService.insert(task);
taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron(), task.getNote(), task.getData());
}
} catch (Exception e) {
e.printStackTrace();
}
}
} else if ("custom".equals(fitnessWalkActivity.getLotteryMode())) {
List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = fitnessWalkActivity.getCustomLotteryRules();
customLotteryRules.removeIf(Lang::isEmpty);
for (FitnessWalkActivity.CustomLotteryRule rule : customLotteryRules) {
Date lotteryTime = rule.getLotteryTime();
SimpleDateFormat dateFormatCron = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
// 设置定时任务执行时间
String cron = dateFormatCron.format(lotteryTime);
try {
//调用类
String jobClass = "io.v.nutz.task.job.fitnessWalk.FitnessWalkLotteryJob";
HashMap<String, Object> map = new HashMap<>(8);
map.put("id", fitnessWalkActivity.get_id());
// 唯一标识的删除id,用于执行定时任务完成后,将此定时任务禁用
map.put("deleteId", R.UU32());
//月抽奖达标步数
map.put("lotteryQualificationStep", rule.getLotteryQualificationStep().toString());
//月抽奖人数
map.put("lotteryUserNum", rule.getLotteryUserNum().toString());
//查询开始时间
map.put("startDate", rule.getStartDate());
//查询结束时间
map.put("endDate", rule.getEndDate());
//抽奖天数
map.put("lotteryQualificationDay", rule.getLotteryQualificationDay());
//获奖名称
map.put("awardName", rule.getAwardName());
//抽奖模式
map.put("mode", "custom");
Sys_task task = new Sys_task();
task.setName(fitnessWalkActivity.getMasterActivityName() + "健步走计步模式自定义抽奖任务");
task.setJobClass(jobClass);
task.setNote("健步走计步模式自定义抽奖任务");
task.setCron(cron);
task.setData(Json.toJson(map));
task.setDisabled(false);
sysTaskService.insert(task);
taskPlatformService.add(task.getId(), task.getId(), task.getJobClass(), task.getCron(), task.getNote(), task.getData());
} catch (Exception e) {
e.printStackTrace();
return;
}
}
}
}
@Override
public Pagination getStepRankingPagination(PageForm pageForm, String activityId, String unionId, String unitId, String mode) {
Sql sql = rankingListSql(pageForm.getSearchName(), pageForm.getSearchKeyword(), activityId, unionId, unitId, mode);
return listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
@Override
public List<NutMap> getStepRankingList(String searchName, String searchKeyword, String activityId, String unionId, String unitId, String mode) {
Sql sql = rankingListSql(searchName, searchKeyword, activityId, unionId, unitId, mode);
return listMap(sql);
}
/**
* 获取中奖榜
*
* @param activityId 活动id
* @return
*/
@Override
public List<NutMap> getWiningRankingUserList(String activityId) {
FitnessWalkActivity activity = getActivity(activityId);
List<NutMap> resultMapList = new ArrayList<>();
if ("everyday".equals(activity.getLotteryMode())) {
String lastDayFormat = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd");
List<FitnessWalkAwardUser> awardUserList = dao().query(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId)
.and("DATE( applyDate )", ">=", lastDayFormat));
//昨天的中奖榜
List<FitnessWalkAwardUser> lastDayAwardUserList = awardUserList.stream().filter(v -> DateUtil.compare(v.getApplyDate(),
DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") == 0).collect(Collectors.toList());
NutMap lastDayAwardMap = new NutMap();
//昨日中奖时间
lastDayAwardMap.put("title", "昨日中奖榜");
lastDayAwardMap.put("lotteryTime", lastDayFormat);
lastDayAwardMap.put("awardName", "幸运奖");
lastDayAwardMap.put("awardList", lastDayAwardUserList);
resultMapList.add(lastDayAwardMap);
//今天的中奖榜
List<FitnessWalkAwardUser> thisDayAwardUserList = (List<FitnessWalkAwardUser>) CollectionUtil.subtract(awardUserList, lastDayAwardUserList);
NutMap thisDayAwardMap = new NutMap();
//今日中奖时间
lastDayAwardMap.put("title", "今日中奖榜");
thisDayAwardMap.put("lotteryTime", DateUtil.today());
thisDayAwardMap.put("awardName", "幸运奖");
thisDayAwardMap.put("awardList", thisDayAwardUserList);
resultMapList.add(thisDayAwardMap);
} else if ("custom".equals(activity.getLotteryMode())) {
List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = activity.getCustomLotteryRules();
//当前活动中奖榜单
List<FitnessWalkAwardUser> awardUserList = dao().query(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId));
for (FitnessWalkActivity.CustomLotteryRule rule : customLotteryRules) {
NutMap map = new NutMap();
List<FitnessWalkAwardUser> customAwardList = awardUserList.stream().filter(v -> DateUtil.compare(v.getApplyDate(), DateUtil.date(rule.getLotteryTime()), "yyyy-MM-dd") == 0).collect(Collectors.toList());
//自定义抽奖时间范围
map.put("title", DateUtil.format(DateUtil.date(rule.getStartDate()), "MM-dd") + "" + DateUtil.format(DateUtil.date(rule.getEndDate()), "MM-dd") + rule.getAwardName() + "中奖榜");
// map.put("customTimeRange", DateUtil.format(DateUtil.date(rule.getStartDate()), "yyyy-MM-dd") + "——" + DateUtil.format(DateUtil.date(rule.getEndDate()), "yyyy-MM-dd"));
//抽奖时间
map.put("lotteryTime", DateUtil.format(rule.getLotteryTime(), "yyyy-MM-dd"));
//奖项名称
map.put("awardName", rule.getAwardName());
//中奖人员
map.put("awardList", customAwardList);
resultMapList.add(map);
}
}
return resultMapList;
}
@Override
public List<NutMap> prizeOption(String activityId) {
List<FitnessWalkAwardUser> list = dao().query(FitnessWalkAwardUser.class,
Cnd.where("activityId", "=", activityId).groupBy("awardName").asc("awardName"));
List<NutMap> collect = list.stream().map(v -> {
NutMap map = new NutMap();
map.put("text", v.getAwardName());
map.put("value", v.getAwardName());
return map;
}).collect(Collectors.toList());
// FitnessWalkActivity activity = getActivity(activityId);
// if ("custom".equals(activity.getLotteryMode())) {
// List<FitnessWalkActivity.CustomLotteryRule> customLotteryRules = activity.getCustomLotteryRules();
// return customLotteryRules.stream().map(rule -> {
// NutMap map = new NutMap();
// map.put("text", DateUtil.format(DateUtil.date(rule.getStartDate()), "MM-dd") + "至" + DateUtil.format(DateUtil.date(rule.getEndDate()), "MM-dd") + rule.getAwardName() + "中奖榜");
// map.put("value", rule.getLotteryTime());
// return map;
// }).collect(Collectors.toList());
// }
return collect;
}
private Sql rankingListSql(String searchName, String searchKeyword, String activityId, String unionId, String unitId, String mode) {
FitnessWalkActivity activity = getActivity(activityId);
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
u.id,
COALESCE(SUM(sub.step), 0) AS total_steps,
u.username,
u.loginname,
u.unionName,
u.unitName,
over3k.standardsDays
FROM
`vw_user` u
LEFT JOIN (
SELECT
userId,
applyDate,
step
FROM
`fitness_walk_step`
WHERE
step >= @step
AND activityId=@activityId
AND $dateSql
GROUP BY
userId,
applyDate
) AS sub ON u.id = sub.userId
LEFT JOIN (
SELECT
userId,
COUNT(DISTINCT DATE(applyDate)) AS standardsDays
FROM
`fitness_walk_step`
WHERE
step >= @step
AND activityId=@activityId
AND $dateSql
GROUP BY
userId
) AS over3k ON u.id = over3k.userId
$condition
""").setParam("activityId",activityId).setParam("step",0);
if ("today".equals(mode)) {
sql.setVar("dateSql",new Static("DATE(applyDate) = '"+DateUtil.today()+"'"));
// cnd.and("DATE( s.applyDate )", "=", DateUtil.today());
} else {
sql.setVar("dateSql",new Static("DATE(applyDate) >= '"
+DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd")+"' and DATE(applyDate) <= '"
+DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd")+"'"));
// cnd.and("DATE( s.applyDate )", ">=", DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"));
// cnd.and("DATE( s.applyDate )", "<=", DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"));
}
if (Strings.isNotBlank(unitId)) {
cnd.and("u.unitId", "=", unitId);
}
if (Strings.isNotBlank(unionId)) {
cnd.and("u.unionId", "=", unionId);
}
if (Strings.isNotBlank(searchName) && Strings.isNotBlank(searchKeyword)) {
cnd.and(searchName, "LIKE", "%" + searchKeyword + "%");
}
// cnd.and("u.id","in",Sqls.create("select userId from activity_user_scope where groupId = @groupId").setParam("groupId",activity.getGroupId()));
cnd.groupBy("u.id","u.username","u.loginname","u.unionName","u.unitName","over3k.standardsDays");
cnd.desc("total_steps");
cnd.having(Cnd.NEW().and("COALESCE(SUM(sub.step), 0)",">",0));
sql.setCondition(cnd);
return sql;
}
}
@@ -0,0 +1,247 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkPunchStatisticsService;
import com.budwk.app.zhgh.activity.fitnesswalk.utils.WeAppCloudUtil;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class FitnessWalkPunchStatisticsServiceImpl extends BaseServiceImpl<FitnessWalkAwardUser> implements FitnessWalkPunchStatisticsService {
public FitnessWalkPunchStatisticsServiceImpl(Dao dao) {
super(dao);
}
@Inject
private WeAppCloudUtil weAppCloudUtil;
@Override
public List<NutMap> unionRegCheckInNum(String activityId, String unionId) {
List<Sys_union> unions = dao().query(Sys_union.class, Cnd.NEW().desc("unioncode"));
//查询报名的数据
StringBuffer regCountSql = new StringBuffer();
regCountSql.append("db.collection('register').aggregate()");
regCountSql.append(".match({");
regCountSql.append("activity_id:'").append(activityId).append("'");
if (StrUtil.isNotBlank(unionId)) {
regCountSql.append(",unionid:'").append(unionId).append("'");
}
regCountSql.append("})");
regCountSql.append(".group({_id:'$unionid',count:$.sum(1)}).end()");
JSONObject regCountJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, regCountSql.toString());
Map<String, Integer> regCountData = regCountJsonObject.getJSONArray("data").stream().map(v -> {
JSONObject rowData = JSONUtil.parseObj((String) v);
String id = rowData.getStr("_id");
int count = rowData.getJSONObject("count").getInt("$numberInt");
return NutMap.NEW().addv("id", id).addv("count", count);
}).collect(Collectors.toMap(v -> v.getString("id"), v -> v.getInt("count")));
//查询打卡的数据
StringBuffer checkInCountSql = new StringBuffer();
checkInCountSql.append("db.collection('sign').aggregate()");
checkInCountSql.append(".match({");
checkInCountSql.append("activity_id:'").append(activityId).append("'");
if (StrUtil.isNotBlank(unionId)) {
checkInCountSql.append(",unionid:'").append(unionId).append("'");
}
checkInCountSql.append("})");
checkInCountSql.append(".group({_id:'$unionid',count: $.addToSet('$userid')})");
checkInCountSql.append(".project({_id: 0,unionid:'$_id',count:$.size('$count')})");
checkInCountSql.append(".end()");
JSONObject checkInCountJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, checkInCountSql.toString());
Map<String, Integer> checkInCountData = checkInCountJsonObject.getJSONArray("data").stream().map(v -> {
JSONObject rowData = JSONUtil.parseObj((String) v);
String id = rowData.getStr("unionid");
int count = rowData.getJSONObject("count").getInt("$numberInt");
return NutMap.NEW().addv("id", id).addv("count", count);
}).collect(Collectors.toMap(v -> v.getString("id"), v -> v.getInt("count")));
List<NutMap> list = unions.stream().map(v -> {
String id = v.getId();
String unionname = v.getName();
String unioncode = v.getUnionCode();
NutMap map = NutMap.NEW();
map.put("id", id);
map.put("unionname", unionname);
map.put("unioncode", unioncode);
map.put("regCount", regCountData.getOrDefault(id, 0));
map.put("checkInCount", checkInCountData.getOrDefault(id, 0));
return map;
}).collect(Collectors.toList());
return list;
}
@Override
public List<JSONObject> unionRegistrationData(String activityId, String unionId) {
StringBuffer sql = new StringBuffer("db.collection('register').aggregate()");
sql.append(".match({");
sql.append("activity_id:'").append(activityId).append("',unionid:'").append(unionId).append("'");
sql.append("})");
sql.append(".addFields({register_time_date:$.toDate('$register_time')})");
sql.append("""
.project({
_id:true,
loginname:true,
username:true,
unitname:true,
mobile:true,
sex:true,
register_time:true,
register_time_str: $.dateToString({
date: '$register_time_date',
format: '%Y-%m-%d %H:%M:%S',
timezone: 'Asia/Shanghai'
})
})
.sort({ unitname: 1 })
.end()
""");
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, sql.toString());
List<JSONObject> list = jsonObject.getJSONArray("data").stream().map(v -> JSONUtil.parseObj((String) v)).collect(Collectors.toList());
return list;
}
@Override
public List<JSONObject> unionCheckInData(String activityId, String unionId) {
// 查询打卡的数据,根据分工会来
String sql = """
db.collection('sign').aggregate()
.match({
activity_id: '%s',
unionid: '%s'
})
.lookup({
from: 'activity',
localField: 'activity_id',
foreignField: '_id',
as: 'activity'
})
.lookup({
from: 'gift_voucher',
let: {
signActivityId: '$activity_id',
signLoginName: '$loginname'
},
pipeline: $.pipeline()
.match({
$expr: {
$and: [
{ $eq: ['$activity_id', '$$signActivityId'] },
{ $eq: ['$loginname', '$$signLoginName'] }
]
}
})
.project({
used: 1,
_id: 0
})
.done(),
as: 'gift_voucher'
})
.addFields({
used: { $arrayElemAt: ['$gift_voucher.used', 0] },
masterActivityName: { $arrayElemAt: ['$activity.masterActivityName', 0] },
pts: { $arrayElemAt: ['$activity.pts', 0] },
})
.group({
_id: {
activity_id: '$activity_id',
loginname: '$loginname'
},
loginname: { $first: '$loginname' },
sex: { $first: '$sex' },
username: { $first: '$username' },
unitname: { $first: '$unitname' },
unionname: { $first: '$unionname' },
used: { $first: '$used' },
sign_size: { $sum: 1 },
masterActivityName: { $first: '$masterActivityName' },
pts_size: { $first: { $size: '$pts' } },
})
.project({
_id: 0,
loginname: 1,
sex: 1,
username: 1,
unitname: 1,
unionname: 1,
used: 1,
sign_size: { $toString: '$sign_size' },
masterActivityName: 1,
pts_size: { $toString: '$pts_size' }
})
.sort({ unitname: 1 })
.end()
""";
sql = sql.formatted(activityId, unionId);
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, sql);
List<JSONObject> list = jsonObject.getJSONArray("data").stream().map(v -> {
JSONObject jo = JSONUtil.parseObj((String) v);
if (jo.getInt("sign_size") > jo.getInt("pts_size")) {
jo.put("sign_size", jo.getInt("pts_size"));
}
return jo;
}).collect(Collectors.toList());
return list;
}
@Override
public List<JSONObject> exportNotGetGiftVoucherUsers(String activityId) {
//查询报名的人员
JSONObject regJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, """
db.collection('register').aggregate([
{ $match: { activity_id: '%s' } }
])
.sort({ unitname: 1 })
.end()
""".formatted(activityId));
//查询打完卡获得礼品券的人员
JSONObject giftUserJsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, """
db.collection('gift_voucher').aggregate()
.match({ activity_id: '%s' })
.group({ _id: '$loginname' })
.project({ _id: 0, loginname: '$_id' })
.end()
""".formatted(activityId));
List<String> giftUserLoginNames = giftUserJsonObject.getJSONArray("data").stream().map(v -> {
JSONObject jo = JSONUtil.parseObj((String) v);
return jo.getStr("loginname");
}).toList();
List<JSONObject> list = regJsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.parseObj((String) v))
.filter(v -> !giftUserLoginNames.contains(v.getStr("loginname"))).collect(Collectors.toList());
return list;
}
@Override
public List<JSONObject> exportNotUseGiftVoucherUsers(String activityId) {
//查询未使用礼品券的人员
JSONObject jsonObject = weAppCloudUtil.request(WeAppCloudUtil.CRUD.AGGREGATE, """
db.collection('gift_voucher').aggregate()
.match({ activity_id: '%s', used: false })
.sort({ unitname: 1 })
.end()
""".formatted(activityId));
return jsonObject.getJSONArray("data").stream()
.map(v -> JSONUtil.parseObj((String) v)).collect(Collectors.toList());
}
}
@@ -0,0 +1,360 @@
package com.budwk.app.zhgh.activity.fitnesswalk.service.impl;
import cn.hutool.core.date.DateUtil;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkActivity;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkAwardUser;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkRaffleRules;
import com.budwk.app.zhgh.activity.fitnesswalk.model.FitnessWalkRaffleUser;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkCommonService;
import com.budwk.app.zhgh.activity.fitnesswalk.service.FitnessWalkStepRaffleService;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @version 1.0
* @Author zzr
* @nameFitnessWalkStepRaffleServiceImpl
* @Date 2024/12/28 11:17
* @注释
*/
@IocBean(args = {"refer:dao"})
public class FitnessWalkStepRaffleServiceImpl extends BaseServiceImpl<FitnessWalkRaffleRules> implements FitnessWalkStepRaffleService {
public FitnessWalkStepRaffleServiceImpl(Dao dao) {
super(dao);
}
@Inject
private FitnessWalkCommonService fitnessWalkCommonService;
/**
* 获取可抽奖用户,那就是达标用户
* @param pageForm
* @param activityId
* @param unionId
* @param unitId
* @return
*/
@Override
public Sql getRaffleSql(PageForm pageForm, String activityId, String unionId, String unitId) {
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
Integer lotteryQualificationDays = activity.getLotteryQualificationDays();
Integer lotteryQualificationSteps = activity.getLotteryQualificationSteps();
Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Cnd cnd = Cnd.NEW();
Sql sql = Sqls.create("""
SELECT
u.id,
COALESCE(SUM(sub.step), 0) AS total_steps,
u.loginname,
u.username,
u.unionId,
u.unionName,
u.unitId,
u.unitName,
over3k.standardsDays
FROM
`vw_user` u
LEFT JOIN (
SELECT
userId,
applyDate,
step
FROM
`fitness_walk_step`
WHERE
activityId = @activityId
AND DATE(applyDate) >= @startDate
AND DATE(applyDate) <= @endDate
$lotteryQualificationDaySql
GROUP BY
userId,
applyDate
) AS sub ON u.id = sub.userId
LEFT JOIN (
SELECT
userId,
COUNT(DISTINCT DATE(applyDate)) AS standardsDays
FROM
`fitness_walk_step`
WHERE
activityId = @activityId
AND DATE(applyDate) >= @startDate
AND DATE(applyDate) <= @endDate
$lotteryQualificationDaySql
GROUP BY
userId
) AS over3k ON u.id = over3k.userId
$condition
""");
if (lotteryQualificationDays != null) {
sql.setVar("lotteryQualificationDaySql", new Static(" AND step >= '%s' ".formatted(lotteryQualificationSteps)));
cnd.having(cnd.and(new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays))));
// sql.setVar("stepHavingSql", new Static(" over3k.standardsDays >= '%s' ".formatted(lotteryQualificationDays)));
} else {
cnd.having(cnd.and(new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps))));
// sql.setVar("stepHavingSql", new Static(" COALESCE(SUM(sub.step), 0) >= '%s' ".formatted(lotteryQualificationSteps)));
}
sql.setParam("activityId", activityId);
sql.setParam("step", lotteryQualificationSteps);
sql.setParam("startDate", startDate);
sql.setParam("endDate", endDate);
if (Strings.isNotBlank(unitId)) {
cnd.and("u.unitId", "=", unitId);
}
if (Strings.isNotBlank(unionId)) {
cnd.and("u.unionId", "=", unionId);
}
if (pageForm != null && Strings.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("u.loginname", pageForm.getSearchKeyword());
seg.orLike("u.username", pageForm.getSearchKeyword());
cnd.and(seg);
}
// cnd.and("u.id","in",Sqls.create("select userId from activity_user_scope where groupId = @groupId").setParam("groupId",activity.getGroupId()));
cnd.groupBy("u.id", "u.username", "u.loginname", "u.unionName", "u.unitName");
cnd.desc("total_steps");
sql.setCondition(cnd);
return sql;
}
/**
* 获取活动的奖项,然后再将奖项去遍历出来
* @param activityId
* @return { index: 0, name: '奖项名称', type: 0 }
*/
@Override
public List<NutMap> getActivityAwardList(String activityId) {
FitnessWalkRaffleRules rules = fetch(Cnd.where("activityId", "=", activityId));
List<FitnessWalkRaffleRules.ManualLotteryRules> manualLotteryRules = rules.getManualLotteryRules();
// 存放奖品列表
List<String> ruleList = new ArrayList<>();
// 奖品数量
int size = manualLotteryRules.size();
if (size == 1) {
String prize = manualLotteryRules.get(0).getAwardName();
for (int i = 0; i < 8; i++) {
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
}
}
} else if (size == 2) {
for (int i = 0; i < 8; i++) {
String prize = manualLotteryRules.get(i % size).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
}
}
} else if (size == 3) {
for (int i = 0; i < 8; ) {
for (int j = 0; j < size && i < 8; j++) {
String prize = manualLotteryRules.get(j).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
i += 2;
}
}
}
} else if (size == 4) {
for (int i = 0; i < 8; ) {
for (int j = 0; j < size && i < 8; j++) {
String prize = manualLotteryRules.get(j).getAwardName();
ruleList.add(prize);
if (ruleList.size() < 8) {
ruleList.add("没有中奖");
i += 2;
}
}
}
} else if (size == 5) {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add(2, "没有中奖");
ruleList.add(4, "没有中奖");
ruleList.add(7, "没有中奖");
} else if (size == 6) {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add(2, "没有中奖");
ruleList.add(6, "没有中奖");
} else {
ruleList = manualLotteryRules.stream().map(FitnessWalkRaffleRules.ManualLotteryRules::getAwardName).collect(Collectors.toList());
ruleList.add("没有中奖");
}
List<String> finalRuleList = ruleList;
List<NutMap> awardList = IntStream.range(0, ruleList.size())
.mapToObj(index -> {
String awardName = finalRuleList.get(index);
NutMap map = NutMap.NEW();
map.put("index", index);
map.put("name", awardName);
map.put("type", "没有中奖".equals(awardName) ? 1 : 0);
return map;
}).collect(Collectors.toList());
return awardList;
}
/**
* 手动抽奖
*
* @param activityId 活动id
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public void manualLottery(String activityId) {
// 删除此活动下的获奖记录
dao().clear(FitnessWalkAwardUser.class, Cnd.where("activityId", "=", activityId));
dao().clear(FitnessWalkRaffleUser.class, Cnd.where("activityId", "=", activityId));
FitnessWalkActivity activity = fitnessWalkCommonService.getActivity(activityId);
Date startDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getStartTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
Date endDate = DateUtil.parse(DateUtil.format(DateUtil.date(activity.getEndTime()), "yyyy-MM-dd"), "yyyy-MM-dd");
// 获取达标的所有人,按照步数倒序
Sql sql = getRaffleSql(null, activityId, null, null);
List<NutMap> list = listMap(sql);
List<FitnessWalkRaffleUser> raffleUserList = list.stream().map(v -> {
FitnessWalkRaffleUser raffleUser = new FitnessWalkRaffleUser();
raffleUser.setId(R.UU32());
raffleUser.setActivityId(activityId);
raffleUser.setUserId(v.getString("id"));
raffleUser.setLoginName(v.getString("loginname"));
raffleUser.setUsername(v.getString("username"));
raffleUser.setAwardSteps(v.getString("total_steps"));
raffleUser.setStandardsDays(v.getInt("standardsDays"));
raffleUser.setIsRaffle(false);
return raffleUser;
}).collect(Collectors.toList());
dao().fastInsert(raffleUserList);
Set<String> winningRankLoginNames = new HashSet<>();
// 获奖人员
List<FitnessWalkAwardUser> winningUsers = new ArrayList<>();
// 获取抽奖规则
FitnessWalkRaffleRules rules = fetch(Cnd.where("activityId", "=", activityId));
List<FitnessWalkRaffleRules.ManualLotteryRules> manualLotteryRules = rules.getManualLotteryRules();
// 找出是按照排名来颁奖的奖项
List<FitnessWalkRaffleRules.ManualLotteryRules> ranks = manualLotteryRules.stream().filter(v -> "排名".equals(v.getRaffleType()))
.sorted(Comparator.comparing(FitnessWalkRaffleRules.ManualLotteryRules::getRankingPosition)).toList();
for (FitnessWalkRaffleRules.ManualLotteryRules rank : ranks) {
String awardName = rank.getAwardName();
Integer lotteryUserNum = rank.getLotteryUserNum();
// 排除之前获奖的人,再倒序排列
List<NutMap> canLotteryUsers = list.stream()
.filter(v -> !winningRankLoginNames.contains(v.getString("loginname")))
.sorted(Comparator.comparingInt((NutMap v) -> v.getInt("total_steps")).reversed())
.toList();
// 截取当前奖项的中奖人员
List<NutMap> rankNutMaps = canLotteryUsers.subList(0, lotteryUserNum);
// 收集成中奖人员存储
List<FitnessWalkAwardUser> collect = rankNutMaps.stream().map(v -> {
FitnessWalkAwardUser awardUser = new FitnessWalkAwardUser();
awardUser.setId(R.UU32());
awardUser.setActivityId(activityId);
awardUser.setUserId(v.getString("id"));
awardUser.setLoginName(v.getString("loginname"));
awardUser.setUsername(v.getString("username"));
awardUser.setAwardName(awardName);
awardUser.setStartDate(startDate);
awardUser.setEndDate(endDate);
awardUser.setUnionId(v.getString("unionid"));
awardUser.setUnionName(v.getString("unionName"));
awardUser.setUnitId(v.getString("unitId"));
awardUser.setUnitName(v.getString("unitName"));
awardUser.setStandardsDays(v.getInt("standardsDays"));
awardUser.setAwardSteps(v.getString("total_steps"));
awardUser.setPoints(rank.getPoints());
return awardUser;
}).toList();
winningRankLoginNames.addAll(collect.stream().map(FitnessWalkAwardUser::getLoginName).toList());
winningUsers.addAll(collect);
}
List<FitnessWalkRaffleRules.ManualLotteryRules> reachList = manualLotteryRules.stream().filter(v -> "达标".equals(v.getRaffleType()))
.sorted(Comparator.comparing(FitnessWalkRaffleRules.ManualLotteryRules::getRankingPosition)).toList();
for (FitnessWalkRaffleRules.ManualLotteryRules reach : reachList) {
List<NutMap> nutMaps;
if (reach.getIsSimultaneously() != null && reach.getIsSimultaneously()) {
// 可以兼得, 达标了的抽奖就是全部达标的人
nutMaps = list;
} else {
// 不可兼得, 这里要排除其他奖项的中奖人员
nutMaps = list.stream().filter(v -> !winningRankLoginNames.contains(v.getString("loginname"))).collect(Collectors.toList());
}
// 抽奖人数
Integer lotteryUserNum = reach.getLotteryUserNum();
// 奖项名称
String awardName = reach.getAwardName();
// 这里是随机打乱了再去抽奖
List<NutMap> reachNutMaps = nutMaps.stream().collect(Collectors.collectingAndThen(Collectors.toList(), collected -> {
int size = Math.min(lotteryUserNum, collected.size());
Collections.shuffle(collected);
return collected.subList(0, size);
}));
List<FitnessWalkAwardUser> collect = reachNutMaps.stream().map(v -> {
FitnessWalkAwardUser awardUser = new FitnessWalkAwardUser();
awardUser.setId(R.UU32());
awardUser.setActivityId(activityId);
awardUser.setUserId(v.getString("id"));
awardUser.setLoginName(v.getString("loginname"));
awardUser.setUsername(v.getString("username"));
awardUser.setAwardName(awardName);
awardUser.setStartDate(startDate);
awardUser.setEndDate(endDate);
awardUser.setUnionId(v.getString("unionid"));
awardUser.setUnionName(v.getString("unionName"));
awardUser.setUnitId(v.getString("unitId"));
awardUser.setUnitName(v.getString("unitName"));
awardUser.setStandardsDays(v.getInt("standardsDays"));
awardUser.setAwardSteps(v.getString("total_steps"));
awardUser.setPoints(reach.getPoints());
return awardUser;
}).toList();
winningRankLoginNames.addAll(collect.stream().map(FitnessWalkAwardUser::getLoginName).toList());
winningUsers.addAll(collect);
}
dao().fastInsert(winningUsers);
}
}
@@ -0,0 +1,170 @@
package com.budwk.app.zhgh.activity.fitnesswalk.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RedisConstant;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import org.nutz.integration.jedis.RedisService;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* 微信小程序云开发工具类
*/
@IocBean
public class WeAppCloudUtil {
public static String ENV = "zufe-6guuuwl17ba1b011";
private static final String APPID = "wx093225a38487550f";
private static final String APP_SECRET = "23e506ca150f342e9afdcd772cced34a";
@Inject
public RedisService redisService;
public JSONObject request(CRUD crud, String sql) {
String url = crud.url.replace("ACCESS_TOKEN", getAccessToken());
String responseJson = HttpUtil.createPost(url).header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(Map.of("env", ENV, "query", sql))).execute().body();
JSONObject response = JSONUtil.parseObj(responseJson);
if (response.getInt("errcode") == 42001) {
redisService.del(RedisConstant.REDIS_KEY_WE_APP_ACCESS_TOKEN);
// request(crud, sql);
} else if (response.getInt("errcode") == 40001) {
redisService.del(RedisConstant.REDIS_KEY_WE_APP_ACCESS_TOKEN);
} else if (response.getInt("errcode") != 0) {
throw new RuntimeException("小程序云函数接口调用失败,errcode:" + response.getStr("errcode") + ",errmsg:" + response.getStr("errmsg"));
}
return response;
}
/**
* 获取token
*
* @return
*/
private String getAccessToken() {
String token = redisService.get(RedisConstant.REDIS_KEY_WE_APP_ACCESS_TOKEN);
if (StrUtil.isNotBlank(token)) {
return token;
}
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET".replace("APPID", APPID).replace("APPSECRET", APP_SECRET);
String responseJson = HttpUtil.createGet(url).execute().body();
TokenResponse tokenResponse = JSONUtil.toBean(responseJson, TokenResponse.class);
// 微信的Access_token,两个小时过期,也就是7200秒
redisService.setex(RedisConstant.REDIS_KEY_WE_APP_ACCESS_TOKEN, 7000, tokenResponse.getAccess_token());
return tokenResponse.getAccess_token();
/*String result = Http.get(url).getContent();
HashMap<String, Object> tokenObject = Json.fromJson(HashMap.class, result);
if (tokenObject.containsKey("errcode")) {
log.error("获取token失败------" + tokenObject.get("errmsg"));
throw new RuntimeException("获取token失败------" + tokenObject.get("errmsg"));
}
redisService.setex(RedisConstant.REDIS_KEY_WE_APP_ACCESS_TOKEN, 7200 - 200, (String) tokenObject.get("access_token"));
return (String) tokenObject.get("access_token");
return null;*/
}
@Getter
@AllArgsConstructor
public enum CRUD {
INSERT("https://api.weixin.qq.com/tcb/databaseadd?access_token=ACCESS_TOKEN"),
QUERY("https://api.weixin.qq.com/tcb/databasequery?access_token=ACCESS_TOKEN"),
DELETE("https://api.weixin.qq.com/tcb/databasedelete?access_token=ACCESS_TOKEN"),
UPDATE("https://api.weixin.qq.com/tcb/databaseupdate?access_token=ACCESS_TOKEN"),
AGGREGATE("https://api.weixin.qq.com/tcb/databaseaggregate?access_token=ACCESS_TOKEN"),
COUNT("https://api.weixin.qq.com/tcb/databasecount?access_token=ACCESS_TOKEN");
private final String url;
}
@Data
public static class Response {
private int errcode;
private String erremsg;
}
@EqualsAndHashCode(callSuper = true)
@Data
public static class TokenResponse extends Response {
private int expires_in;
private String access_token;
}
/**
* 上传文件返回cloud—url
*
* @param rootPath
* @param file
* @return
*/
public String uploadFile(String rootPath, File file) {
String path = rootPath + file.getName();
String url = "https://api.weixin.qq.com/tcb/uploadfile?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", getAccessToken());
String responseJson = HttpUtil.createPost(url).header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(Map.of("env", ENV, "path", path))).execute().body();
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
if (jsonObject.getInt("errcode") != 0) {
throw new RuntimeException(jsonObject.getStr("errmsg"));
}
try{
HttpUtil.createPost(jsonObject.getStr("url"))
.form("key", path)
.form("Signature", jsonObject.getStr("authorization"))
.form("x-cos-security-token", jsonObject.getStr("token"))
.form("x-cos-meta-fileid", jsonObject.getStr("cos_file_id"))
.form("file", file)
.execute().body();
return jsonObject.getStr("file_id");
}catch (Exception e){
return jsonObject.getStr("file_id");
}
}
public String httpFile(String fileId) {
String url = "https://api.weixin.qq.com/tcb/batchdownloadfile?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", getAccessToken());
HashMap<Object, Object> body = new HashMap<>(2) {{
put("env", ENV);
put("file_list", new ArrayList<>() {{
add(new HashMap<>() {{
put("fileid", fileId);
put("max_age", 7200);
}});
}});
}};
Map mf = new HashMap<String, String>();
mf.put("fileid", fileId);
mf.put("max_age", 7200);
ArrayList<Map> fm = new ArrayList<>();
fm.add(mf);
body.put("file_list", fm);
String responseJson = HttpUtil.createPost(url)
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(body))
.execute().body();
System.out.println(JSONUtil.toJsonStr(body));
JSONObject jsonObject = JSONUtil.parseObj(responseJson);
if (jsonObject.getInt("errcode") != 0) {
throw new RuntimeException(jsonObject.getStr("errmsg"));
}
return jsonObject.getJSONArray("file_list").toList(JSONObject.class).get(0).getStr("download_url");
}
}
@@ -0,0 +1,308 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.data;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeDataRevel;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.boot.starter.ftp.FtpService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Criteria;
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.lang.Lang;
import org.nutz.lang.random.R;
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 javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDataRevelController
* @Date 2024/7/30 15:48
* @注释 职工建家资料管理
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家资料管理")
@At("/platform/workershome/data/revel")
public class WorkersHomeDataRevelController {
@Inject
private Dao dao;
@Inject
private FtpService ftpsService;
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/data/revel.html")
@SaCheckPermission("workershome.data.revel")
public void index() {
}
@At
@ApiOperation("获取职工小家的树形数据,按分工会展示")
@SaCheckPermission("workershome.data.revel")
public Result getTreeData(@Param("year") String year,
@Param("revelName") String revelName,
@Param("typeId") String typeId) {
NutMap nutMap = NutMap.NEW();
nutMap.setv("unionname", "工会委员会");
Sql sql = Sqls.create("""
select
un.*,
un.name AS unionname,
(select count(*) from workers_home_data_revel whdr where whdr.belongToUnionId = un.id $revelCount) as revelCount
from
sys_union un
$condition
""");
Criteria criteria = Cnd.cri();
criteria.where().setTop(false);
if (StringUtils.isNotBlank(year)) {
criteria.where().and("year(whdr.time)", "=", year);
}
if (StringUtils.isNotBlank(revelName)) {
criteria.where().and(Cnd.likeEX("whdr.revelName", revelName));
}
if (StringUtils.isNotBlank(typeId)) {
criteria.where().and("whdr.typeId", "=", typeId);
}
if (!criteria.where().isEmpty()) {
sql.vars().set("revelCount", "and " + criteria.toSql(null));
}
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("un.id", "=", SecurityUtil.getUnionId());
}
cnd.asc("un.unioncode");
sql.setCondition(cnd);
nutMap.setv("child", workersHomeInfoService.listMap(sql));
return Result.success().addData(List.of(nutMap));
}
@At
@ApiOperation("按照工会查询职工小家资料列表")
@SaCheckPermission("workershome.data.revel")
public Object pageData(PageForm pageForm,
@Param("year") String year,
@Param("revelName") String revelName,
@Param("typeId") String typeId,
@Param("unionId") String unionId) {
try {
Sql sql = Sqls.create("""
SELECT
whdr.*,
whdt.typeName
FROM
workers_home_data_revel whdr
LEFT JOIN workers_home_data_type whdt ON whdr.typeId = whdt.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("year(whdr.time)", "=", year);
if (StrUtil.isNotBlank(revelName)) {
cnd.and(Cnd.likeEX("whdr.revelName", revelName));
}
cnd.andEX("whdr.typeId", "=", typeId);
cnd.andEX("whdr.unionId", "=", unionId);
cnd.desc("whdr.time");
sql.setCondition(cnd);
Pagination pagination = workersHomeInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
} catch (Exception e) {
e.printStackTrace();
return Result.error();
}
}
@At
@ApiOperation("职工小家资料添加")
@SaCheckPermission("workershome.data.revel")
@SLog(tag = "职工小家资料添加", msg = "职工小家资料名称: ${args[0].revelName}")
public Result doAdd(WorkersHomeDataRevel workersHomeDataRevel) {
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
workersHomeDataRevel.setId(R.UU32());
workersHomeDataRevel.setUserId(user.getId());
workersHomeDataRevel.setUsername(user.getUsername());
workersHomeDataRevel.setLoginName(user.getLoginname());
workersHomeDataRevel.setUnitId(user.getUnitId());
workersHomeDataRevel.setUnitName(user.getUnitName());
workersHomeDataRevel.setUnionId(user.getUnionId());
workersHomeDataRevel.setUnionName(user.getUnionName());
workersHomeDataRevel.setTime(DateUtil.now());
if (StrUtil.isNotBlank(workersHomeDataRevel.getBelongToUnionId())) {
Sys_union union = dao.fetch(Sys_union.class, workersHomeDataRevel.getBelongToUnionId());
workersHomeDataRevel.setBelongToUnionName(union.getName());
} else {
workersHomeDataRevel.setBelongToUnionId(user.getUnionId());
workersHomeDataRevel.setBelongToUnionName(user.getUnionName());
}
dao.fastInsert(workersHomeDataRevel);
return Result.success();
}
@At
@ApiOperation("职工小家资料修改")
@SaCheckPermission("workershome.data.revel")
@SLog(tag = "职工小家资料修改", msg = "职工小家资料名称: ${args[0].revelName}")
public Result doEdit(WorkersHomeDataRevel workersHomeDataRevel) {
dao.update(workersHomeDataRevel);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工小家资料删除")
@SaCheckPermission("workershome.data.revel")
@SLog(tag = "职工小家资料删除", msg = "职工小家资料id: ${args[0]}")
public Result doDelete(String id) {
WorkersHomeDataRevel revel = dao.fetch(WorkersHomeDataRevel.class, id);
if (revel != null) {
if (revel.getFiles() != null && !revel.getFiles().isEmpty()) {
Set<String> fileIds = revel.getFiles().stream().map(Sys_file::getId).collect(Collectors.toSet());
dao.clear(Sys_file.class, Cnd.where("id", "in", fileIds));
}
dao.clear(WorkersHomeDataRevel.class, Cnd.where("id", "=", id));
}
return Result.success();
}
@At
@Ok("void")
@ApiOperation("按工会导出所有资料")
@SaCheckPermission("workershome.data.revel")
public void exportAllFileByUnionId(String unionId, String unionName, HttpServletResponse response) {
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
// 创建临时文件夹
String tmpPath = "tmp/" + R.UU32();
File tmpDir = new File(tmpPath + "/" + unionName + "附件汇总");
tmpDir.mkdirs();
List<WorkersHomeDataRevel> query = dao.query(WorkersHomeDataRevel.class, Cnd.where("belongToUnionId", "=", unionId));
try {
if (Lang.isNotEmpty(query)) {
for (WorkersHomeDataRevel revel : query) {
// 创建资料名称的文件夹
String fileName = revel.getRevelName();
File tDir = new File(tmpDir + "/" + fileName);
tDir.mkdirs();
// if (Lang.isNotEmpty(revel.getFiles())) {
// for (Sys_file file : revel.getFiles()) {
// FileOutputStream outputStream = new FileOutputStream(tDir.getPath() + "/" + file.getFilename());
// ftpsService.download(file.getFilepath(), outputStream);
// outputStream.close();
// }
// }
}
String aimsDir = "zipTmp/" + R.UU32();
String aimsName = unionName + "附件汇总.zip";
String aimsPath = aimsDir + "/" + aimsName;
// FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(aimsName, "UTF-8"));
File aimsFile = new File(aimsPath);
FileInputStream inputStream = new FileInputStream(aimsFile);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();
aimsFile.delete();
// FileUtil.deleteDir(new File(tmpPath));
// FileUtil.deleteDir(new File(aimsDir));
}
} catch (Exception e) {
e.printStackTrace();
}
}
@At
@Ok("void")
@ApiOperation("导出单个资料")
@SaCheckPermission("workershome.data.revel")
public void exportAllFileById(String id, HttpServletResponse response) {
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
WorkersHomeDataRevel dataRevel = dao.fetch(WorkersHomeDataRevel.class, Cnd.where("id", "=", id));
// 创建临时文件夹
String tmpPath = "tmp/" + R.UU32();
File tmpDir = new File(tmpPath + "/" + dataRevel.getBelongToUnionName() + dataRevel.getRevelName() + "附件汇总");
tmpDir.mkdirs();
try {
if (Lang.isNotEmpty(dataRevel.getFiles())) {
// for (Sys_file file : dataRevel.getFiles()) {
// FileOutputStream outputStream = new FileOutputStream(tmpDir.getPath() + "/" + file.getFilename());
// ftpsService.download(file.getFilepath(), outputStream);
// outputStream.close();
// }
}
String aimsDir = "zipTmp/" + R.UU32();
String aimsName = dataRevel.getBelongToUnionName() + dataRevel.getRevelName() + "附件汇总.zip";
String aimsPath = aimsDir + "/" + aimsName;
// FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(aimsName, "UTF-8"));
File aimsFile = new File(aimsPath);
FileInputStream inputStream = new FileInputStream(aimsFile);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();
aimsFile.delete();
// FileUtil.deleteDir(new File(tmpPath));
// FileUtil.deleteDir(new File(aimsDir));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,134 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.data;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeDataType;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
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.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.lang.random.R;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDataTypeController
* @Date 2024/7/30 15:48
* @注释
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家资料类型管理")
@At("/platform/workershome/data/type")
public class WorkersHomeDataTypeController {
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/data/type.html")
@SaCheckPermission("workershome.data.type")
public void index() {
}
@At
@ApiOperation("资料类型数据展示")
@SaCheckPermission("workershome.data.type")
public Result pageData(PageForm pageForm,
@Param("typeName") String typeName) {
Sql sql = Sqls.create("select * from workers_home_data_type $condition");
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(typeName)) {
cnd.and(Cnd.likeEX("typeName", typeName));
}
cnd.asc("serialNum");
sql.setCondition(cnd);
Pagination pagination = workersHomeInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("新增资料类型")
@SaCheckPermission("workershome.data.type")
@SLog(tag = "职工小家资料类型添加", msg = "职工小家资料类型名称: ${args[0].typeName}")
public Result doAdd(WorkersHomeDataType workersHomeDataType) {
int count = workersHomeInfoService.dao().count("workers_home_data_type", Cnd.where("code", "=", workersHomeDataType.getCode()));
if (count > 0) {
return Result.error("编码重复");
}
workersHomeDataType.setId(R.UU32());
int totalCount = workersHomeInfoService.count("workers_home_data_type");
workersHomeDataType.setSerialNum(totalCount + 1);
workersHomeInfoService.insert("workers_home_data_type", Chain.from(workersHomeDataType));
return Result.success();
}
@At
@ApiOperation("修改资料类型")
@SaCheckPermission("workershome.data.type")
@SLog(tag = "职工小家资料类型修改", msg = "职工小家资料类型名称: ${args[0].typeName}")
public Result doEdit(WorkersHomeDataType workersHomeDataType) {
int count = workersHomeInfoService.count("workers_home_data_type", Cnd.where("code", "=", workersHomeDataType.getCode()).and("id", "!=", workersHomeDataType.getId()));
if (count > 0) {
return Result.error("编码重复");
}
workersHomeInfoService.update("workers_home_data_type", Chain.from(workersHomeDataType), Cnd.where("id", "=", workersHomeDataType.getId()));
return Result.success();
}
@At
@ApiOperation("删除资料类型")
@SaCheckPermission("workershome.data.type")
@SLog(tag = "职工小家资料类型删除", msg = "职工小家资料类型id: ${args[0]}")
public Result doDelete(String id) {
workersHomeInfoService.dao().clear(WorkersHomeDataType.class, Cnd.where("id", "=", id));
return Result.success();
}
@At
@ApiOperation("获取所有资料类型")
@SaCheckPermission("workershome.data.type")
public Result getAllWakesHomeDataType() {
List<WorkersHomeDataType> list = workersHomeInfoService.dao().query(WorkersHomeDataType.class, Cnd.NEW().asc("serialNum"));
return Result.success().addData(list);
}
@At
@ApiOperation("资料类型排序")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("workershome.data.type")
public Result serialNumChange(String id, Integer serialNum, boolean toDown) {
if (toDown) {
WorkersHomeDataType next = workersHomeInfoService.dao().fetch(WorkersHomeDataType.class, Cnd.where("serialNum", "=", serialNum + 1));
next.setSerialNum(serialNum - 1);
workersHomeInfoService.dao().update(next);
workersHomeInfoService.dao().update(WorkersHomeDataType.class, Chain.make("serialNum", serialNum + 1), Cnd.where("id", "=", id));
} else {
WorkersHomeDataType pre = workersHomeInfoService.dao().fetch(WorkersHomeDataType.class, Cnd.where("serialNum", "=", serialNum - 1));
pre.setSerialNum(serialNum + 1);
workersHomeInfoService.dao().update(pre);
workersHomeInfoService.dao().update(WorkersHomeDataType.class, Chain.make("serialNum", serialNum - 1), Cnd.where("id", "=", id));
}
return Result.success();
}
}
@@ -0,0 +1,93 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.declaration;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDeclarationApplyController
* @Date 2024/7/30 14:06
* @注释 职工建家申报
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家申报")
@At("/platform/workershome/declaration/apply")
public class WorkersHomeDeclarationApplyController {
@Inject
private WorkersHomeApplyService workersHomeApplyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/declaration/apply.html")
@SaCheckPermission("workershome.declaration.apply")
public void index() {}
@At
@ApiOperation("职工建家申报保存")
@SLog(tag = "职工建家申报保存", msg = "职工建家申报信息")
@SaCheckPermission("workershome.declaration.apply")
public Result doSave(WorkersHomeApply workersHomeApply) {
workersHomeApply.setState("10000");
if (StrUtil.isNotBlank(workersHomeApply.getId())) {
workersHomeApplyService.update(workersHomeApply);
} else {
workersHomeApplyService.setParams(workersHomeApply);
workersHomeApplyService.fastInsert(workersHomeApply);
}
return Result.success();
}
@At
@ApiOperation("职工建家申报提交")
@SLog(tag = "职工建家申报提交", msg = "职工建家申报信息")
@SaCheckPermission("workershome.declaration.apply")
public Result doSubmit(WorkersHomeApply workersHomeApply) {
workersHomeApply.setState("10020");
if (StrUtil.isNotBlank(workersHomeApply.getId())) {
workersHomeApplyService.update(workersHomeApply);
} else {
workersHomeApply.setId(R.UU32());
workersHomeApplyService.setParams(workersHomeApply);
workersHomeApplyService.fastInsert(workersHomeApply);
}
return Result.success();
}
@At
@ApiOperation("职工建家申报信息查询")
@SaCheckPermission(value = {"workershome.declaration.apply","workershome.declaration.mine",
"workershome.declaration.organization", "workershome.declaration.school",
"workershome.declaration.statistics"}, mode = SaMode.OR)
public Result getInfoById(String id){
NutMap map = workersHomeApplyService.findById(id);
return Result.success().addData(map);
}
@At
@ApiOperation("职工建家申报工会信息查询")
@SaCheckPermission("workershome.declaration.apply")
public Result getWakesHomeUnitInfo() {
WorkersHomeApply apply = workersHomeApplyService.fetch(Cnd.where("unionId", "=", SecurityUtil.getUnionId()));
return Result.success().addData(apply);
}
}
@@ -0,0 +1,147 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.declaration;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDeclarationMineController
* @Date 2024/7/30 14:06
* @注释 我的建家申报
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家我的申报")
@At("/platform/workershome/declaration/mine")
public class WorkersHomeDeclarationMineController {
@Inject
private WorkersHomeApplyService workersHomeApplyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/declaration/mine.html")
@SaCheckPermission("workershome.declaration.mine")
public void index() {
}
@At
@ApiOperation("获取职工建家我的申报列表")
@SaCheckPermission("workershome.declaration.mine")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("unionId") String unionId) {
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home_apply` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(wh.applyDate)", "=", year);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.andEX("unionId", "=", unionId);
}
sql.setCondition(cnd);
Pagination pagination = workersHomeApplyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家我的申报删除")
@SLog(tag = "职工建家我的申报删除", msg = "职工建家我的申报id: ${args[0]}")
@SaCheckPermission(value = {"workershome.declaration.apply", "workershome.declaration.mine"}, mode = SaMode.OR)
public Result doDelete(String id) {
WorkersHomeApply apply = workersHomeApplyService.fetch(id);
if (StrUtil.isNotBlank(apply.getOrganizationAuditId())) {
workersHomeApplyService.dao().delete(Audit.class, apply.getOrganizationAuditId());
}
if (StrUtil.isNotBlank(apply.getSchoolAuditId())) {
workersHomeApplyService.dao().delete(Audit.class, apply.getSchoolAuditId());
}
workersHomeApplyService.delete(id);
return Result.success();
}
@At
@Ok("void")
public void openExport(String id, HttpServletResponse response) {
// try {
// NutMap nutMap = workersHomeApplyService.findById(id);
//
// HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
// HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
// htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
//
// Configure config = Configure.newBuilder()
// .bind("basicInformation", htmlRenderPolicy)
// .bind("constructionPlan", htmlRenderPolicy).build();
// HashMap<String, Object> map = new HashMap<>();
// String fileName = Globals.schoolName + "“教工小家”建设计划书";
// map.put("fileName", fileName);
// map.put("schoolName", Globals.schoolName);
// map.put("unionName", nutMap.getString("unionName"));
// map.put("applyDate", nutMap.getString("applyDate"));
// map.put("username", nutMap.getString("username"));
// map.put("mobile", nutMap.getString("mobile"));
// map.put("basicInformation", nutMap.getString("basicInformation"));
// map.put("constructionPlan", nutMap.getString("constructionPlan"));
// NutMap schoolAudit = nutMap.getAs("schoolAudit", NutMap.class);
// if (Lang.isNotEmpty(schoolAudit)){
// schoolAudit.setv("auditTime", DateUtil.formatDate(schoolAudit.getTime("auditTime")));
// schoolAudit.setv("auditSign", Vi.getImg(schoolAudit.getString("auditSign")));
// map.put("schoolAudit", schoolAudit);
// }
// NutMap organizationAudit = nutMap.getAs("organizationAudit", NutMap.class);
// if (Lang.isNotEmpty(organizationAudit)){
// organizationAudit.setv("auditTime", DateUtil.formatDate(organizationAudit.getTime("auditTime")));
// organizationAudit.setv("auditSign", Vi.getImg(organizationAudit.getString("auditSign")));
// map.put("organizationAudit", organizationAudit);
// }
//
//
//
//
// response.addHeader("Content-Type", "application/octet-stream");
// response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\".docx");
// InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/workershome/workershome.docx");
// XWPFTemplate.compile(inputStream, config).render(map, response.getOutputStream());
// inputStream.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
@@ -0,0 +1,100 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.declaration;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import io.swagger.annotations.ApiOperation;
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.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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @version 1.0
* @Author zzr
* @nameWakesHomeDeclarationOrganization
* @Date 2024/7/30 14:07
* @注释 建家申报党组织审核
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家申报党组织审核")
@At("/platform/workershome/declaration/organization")
public class WorkersHomeDeclarationOrganizationController {
@Inject
private WorkersHomeApplyService workersHomeApplyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/declaration/organizationAudit.html")
@SaCheckPermission("workershome.declaration.organization")
public void index() {
}
@At
@ApiOperation("职工建家申报党组织审核")
@SaCheckPermission("workershome.declaration.organization")
public Result pageData(PageForm pageForm, @Param("year") Integer year,
@Param("unionId") String unionId, @Param("isAudit") String isAudit) {
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home_apply` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("wh.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.andEX("wh.unionId", "=", unionId);
}
cnd.andEX("YEAR(wh.applyDate)", "=", year);
cnd.and("wh.state", "true".equals(isAudit) ? ">" : "false".equals(isAudit) ? "=" : ">=", 10010);
sql.setCondition(cnd);
Pagination pagination = workersHomeApplyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家申报党组织审核")
@SaCheckPermission("workershome.declaration.organization")
public Result doAudit(@Param("audit") Audit audit, String id) {
Boolean auditPass = audit.getAuditPass();
workersHomeApplyService.dao().insert(audit);
workersHomeApplyService.update(Chain.make("state", auditPass ? 10020 : 10015)
.add("organizationAuditId", audit.getId()), Cnd.where("id", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("workershome.declaration.organization")
public Result doRollBack(String id){
WorkersHomeApply workershome = workersHomeApplyService.fetch(id);
workersHomeApplyService.dao().clear(Audit.class,Cnd.where("id","=",workershome.getOrganizationAuditId()));
workersHomeApplyService.update(Chain.make("state",10010).add("organizationAuditId",null),Cnd.where("id","=",id));
return Result.success();
}
}
@@ -0,0 +1,119 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.declaration;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import io.swagger.annotations.ApiOperation;
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.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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDeclarationSchoolController
* @Date 2024/7/30 14:07
* @注释 建家申报校工会审核
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家校工会审核")
@At("/platform/workershome/declaration/school")
public class WorkersHomeDeclarationSchoolController {
@Inject
private WorkersHomeApplyService workersHomeApplyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/declaration/schoolAudit.html")
@SaCheckPermission("workershome.declaration.school")
public void index() {
}
@At
@ApiOperation("获取职工建家校工会审核列表")
@SaCheckPermission("workershome.declaration.school")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("unionId") String unionId,
@Param("isAudit") String isAudit) {
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home_apply` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("wh.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.andEX("wh.unionId", "=", unionId);
}
cnd.andEX("YEAR(wh.applyDate)", "=", year);
cnd.and("wh.state", "true".equals(isAudit) ? ">" : "false".equals(isAudit) ? "=" : ">=", 10020);
sql.setCondition(cnd);
Pagination pagination = workersHomeApplyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家校工会审核")
@SaCheckPermission("workershome.declaration.school")
@SLog(tag = "职工建家校工会审核", msg = "职工建家校工会审核id: ${args[1]}")
public Result doAudit(@Param("audit") Audit audit, String id) {
Boolean auditPass = audit.getAuditPass();
workersHomeApplyService.dao().insert(audit);
workersHomeApplyService.update(Chain.make("state", auditPass ? 10030 : 10025)
.add("schoolAuditId", audit.getId()), Cnd.where("id", "=", id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家校工会审核撤回")
@SaCheckPermission("workershome.declaration.school")
@SLog(tag = "职工建家校工会审核撤回", msg = "职工建家校工会审核撤回id: ${args[0]}")
public Result doRollBack(String id) {
WorkersHomeApply workersHome = workersHomeApplyService.fetch(id);
workersHomeApplyService.dao().clear(Audit.class, Cnd.where("id", "=", workersHome.getSchoolAuditId()));
workersHomeApplyService.update(Chain.make("state", 10020).add("schoolAuditId", null), Cnd.where("id", "=", id));
return Result.success();
}
@At
@ApiOperation("职工建家校工会审核文件上传")
@SaCheckPermission("workershome.declaration.school")
public Result doFiles(String id, String files) {
WorkersHomeApply wakesHomeApply = new WorkersHomeApply();
wakesHomeApply.setId(id);
wakesHomeApply.setFiles(JSONUtil.toList(files, JSONObject.class));
workersHomeApplyService.updateIgnoreNull(wakesHomeApply);
return Result.success();
}
}
@@ -0,0 +1,71 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.declaration;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import io.swagger.annotations.ApiOperation;
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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeDeclarationStatisticsController
* @Date 2024/8/2 15:00
* @注释 申报,查询统计
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工建家统计")
@At("/platform/workershome/declaration/statistics")
public class WorkersHomeDeclarationStatisticsController {
@Inject
private WorkersHomeApplyService workersHomeApplyService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/declaration/statistics.html")
@SaCheckPermission("workershome.declaration.statistics")
public void index() {}
@At
@ApiOperation("获取职工建家统计列表")
@SaCheckPermission("workershome.declaration.statistics")
public Result pageData(PageForm pageForm,
@Param("year") Integer year,
@Param("unionId") String unionId){
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home_apply` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.and("wh.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.andEX("wh.unionId", "=", unionId);
}
cnd.andEX("YEAR(wh.applyDate)", "=", year);
cnd.and("wh.state", "=" , 10030);
sql.setCondition(cnd);
Pagination pagination = workersHomeApplyService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
}
@@ -0,0 +1,66 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.info;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHome;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
import org.nutz.dao.Cnd;
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
@Ok("json:full")
@ApiOperation("职工建家信息填报")
@At("/platform/workershome/info/apply")
public class WorkersHomeApplyController {
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/info/apply.html")
@SaCheckPermission("workershome.info.apply")
public void index() {}
@At
@SaCheckPermission("workershome.info.apply")
public Result doAdd(WorkersHome workershome, Boolean isSubmit){
if (isSubmit){
workershome.setState(8120);
} else {
workershome.setState(8100);
}
if (!"校工会".equals(workershome.getCategory())){
workershome.setUnionId(SecurityUtil.getUnionId());
}
workersHomeInfoService.insert(workershome);
return Result.success();
}
@At
@SaCheckPermission("workershome.info.apply")
public Result doEdit(WorkersHome workershome,Boolean isSubmit){
if (isSubmit){
workershome.setState(8120);
}
workersHomeInfoService.updateIgnoreNull(workershome);
return Result.success();
}
@At
@SaCheckPermission("workershome.info.apply")
public Result validateApply(){
int count = workersHomeInfoService.dao().count(WorkersHomeApply.class,
Cnd.where("state", "=", "10030")
.and("unionId", "=", SecurityUtil.getUnionId()));
return (count > 0) ? Result.success() : Result.error();
}
}
@@ -0,0 +1,60 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.info;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
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.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
@IocBean
@Ok("json:full")
@ApiOperation("职工建家信息查询")
@At("/platform/workershome/info/info")
public class WorkersHomeInfoController {
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/info/info.html")
@SaCheckPermission("workershome.info.info")
public void index() {}
@At
@ApiOperation("职工建家信息查询")
@SaCheckPermission("workershome.info.info")
public Result pageData(PageForm pageForm, @Param("year") Integer year, @Param("unionId") String unionId){
Sql sql = Sqls.create("""
SELECT
wh.*
FROM
`workers_home` wh
LEFT JOIN sys_union su ON su.id = wh.unionId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(applyTime)","=",year);
if ("校工会".equals(unionId)){
cnd.and("wh.category","=","校工会");
} else {
cnd.andEX("wh.unionId","=",unionId);
}
cnd.and("wh.state","=",8130);
cnd.asc("su.unioncode");
sql.setCondition(cnd);
List<NutMap> list = workersHomeInfoService.listMap(sql);
return Result.success().addData(list);
}
}
@@ -0,0 +1,97 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.info;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHome;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
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.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
@IocBean
@Ok("json:full")
@ApiOperation("职工建家信息我的填报")
@At("/platform/workershome/info/mine")
public class WorkersHomeMineController {
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/info/mine.html")
@SaCheckPermission("workershome.info.mine")
public void index() {}
@At
@ApiOperation("职工建家信息我的填报列表")
@SaCheckPermission("workershome.info.mine")
public Result pageData(PageForm pageForm, @Param("year") Integer year, @Param("unionId")String unionId){
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(applyTime)","=",year);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())){
cnd.and("unionId","=", SecurityUtil.getUnionId());
} else {
if ("校工会".equals(unionId)){
cnd.and("wh.category","=","校工会");
} else {
cnd.andEX("unionId", "=", unionId);
}
}
sql.setCondition(cnd);
Pagination pagination = workersHomeInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("职工建家信息我的填报详情")
@SaCheckPermission(value = {"workershome.info.mine","workershome.info.apply"}, mode = SaMode.OR)
public Result getInfoById(String id){
WorkersHome workersHome = workersHomeInfoService.fetch(id);
NutMap nutMap = Lang.obj2nutmap(workersHome);
Audit audit = workersHomeInfoService.dao().fetch(Audit.class, Cnd.where("id", "=", workersHome.getSchoolAuditId()));
if (Lang.isNotEmpty(audit)){
nutMap.setv("schoolAudit",audit);
}
return Result.success().addData(nutMap);
}
@At
@ApiOperation("职工建家信息我的填报删除")
@SaCheckPermission("workershome.info.mine")
@SLog(tag = "职工建家信息", msg = "职工建家信息删除id: ${args[0]}")
public Result doRemove(String id){
workersHomeInfoService.delete(id);
return Result.success();
}
}
@@ -0,0 +1,102 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.info;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHome;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import io.swagger.annotations.ApiOperation;
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.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.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
@IocBean
@Ok("json:full")
@ApiOperation("职工建家信息校工会审核")
@At("/platform/workershome/info/schoolaudit")
public class WorkersHomeSchoolAuditController {
@Inject
private WorkersHomeInfoService workersHomeInfoService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/info/schoolAudit.html")
@SaCheckPermission("workershome.info.schoolaudit")
public void index() {}
@At
@ApiOperation("职工建家信息校工会审核列表")
@SaCheckPermission("workershome.info.schoolaudit")
public Result pageData(PageForm pageForm, @Param("year") Integer year,
@Param("unionId")String unionId, @Param("isAudit") String isAudit){
Sql sql = Sqls.create("""
SELECT
wh.*,
audit.stateName
FROM
`workers_home` wh
LEFT JOIN audit_state audit ON wh.state = audit.stateId
AND audit.module = 'workershome'
$condition
""");
Cnd cnd = Cnd.NEW();
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())){
cnd.and("unionId", "=" , SecurityUtil.getUnionId());
} else {
if ("校工会".equals(unionId)){
cnd.and("wh.category","=","校工会");
} else {
cnd.andEX("unionId", "=", unionId);
}
}
cnd.andEX("YEAR(applyTime)","=",year);
cnd.and("wh.state", "true".equals(isAudit) ? ">" : "false".equals(isAudit) ? "=" : ">=", 8120);
sql.setCondition(cnd);
Pagination pagination = workersHomeInfoService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家信息校工会审核")
@SaCheckPermission("workershome.info.schoolaudit")
@SLog(tag = "职工建家信息校工会审核", msg = "职工建家信息校工会审核id: ${args[1]}")
public Result doAudit(@Param("audit") Audit audit, String id, String isPass){
workersHomeInfoService.dao().insert(audit);
workersHomeInfoService.update(Chain.make("state","1".equals(isPass) ? 8130 : 8125)
.add("schoolAuditId",audit.getId()), Cnd.where("id","=",id));
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("职工建家信息校工会审核撤回")
@SaCheckPermission("workershome.info.schoolaudit")
@SLog(tag = "职工建家信息校工会审核撤回", msg = "职工建家信息校工会审核撤回id: ${args[0]}")
public Object doRollBack(String id){
WorkersHome workersHome = workersHomeInfoService.fetch(id);
workersHomeInfoService.dao().clear(Audit.class,Cnd.where("id","=",workersHome.getSchoolAuditId()));
workersHomeInfoService.update(Chain.make("state",8120).add("schoolAuditId",null),Cnd.where("id","=",id));
return null;
}
}
@@ -0,0 +1,115 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.review;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import io.swagger.annotations.ApiOperation;
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.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.List;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeReviewController
* @Date 2024/8/1 16:47
* @注释 pc端职工评议
*/
@IocBean
@Ok("json:full")
@ApiOperation("电脑端的职工评议")
@At("/platform/workershome/review/doReview")
public class WorkersHomeReviewController {
@Inject
private CommentZbService commentZbService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/review/doReview.html")
@SaCheckPermission("workershome.review.doReview")
public void index() {
}
@At
@ApiOperation("职工评议分页数据")
@SaCheckPermission("workershome.review.doReview")
public Result pageData(PageForm pageForm,
@Param("annual") String annual,
@Param("assessment") String assessment){
Sql sql = Sqls.create("""
SELECT
zb.* ,
if((select count(1) from comment_peo peo where peo.zbId = zb.id and peo.userId = @userId) > 0,true,false) as isReview
FROM
`comment_zb` zb
$condition
""").setParam("userId", SecurityUtil.getUserId());
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(annual) && Strings.isNotBlank(annual)) {
cnd.and("zb.annual", "=", annual);
}
if (Strings.isNotBlank(assessment) && Strings.isNotBlank(assessment)) {
cnd.where().andLike("zb.assessment", assessment);
} else {
cnd.desc("zb.annual");
}
sql.setCondition(cnd);
Pagination pagination = commentZbService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
List<Sys_union> unionList = commentZbService.dao().query(Sys_union.class, Cnd.NEW());
list.forEach(v -> {
//自评模式
boolean reviewMode = v.getInt("reviewMode") == 1;
if (reviewMode && v.getInt("commentTarget") == 1) {
//校工会自评,判断有没有校工会管理员的权限
v.put("canJoin", AuthUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name()));
} else if (reviewMode && v.getInt("commentTarget") == 2){
//分工会自评,判断有没有分工会管理员
v.put("canJoin", AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()));
}
//自选分工会的模式
if (StrUtil.isNotBlank(v.getString("unionIds"))) {
List<String> unionIdList = JSONUtil.parseArray(v.getString("unionIds")).toList(String.class);
String string = unionList.stream().filter(item -> unionIdList.contains(item.getId()))
.map(Sys_union::getName).collect(Collectors.joining(","));
v.put("unionNames", string);
//如果是自评,只有分工会主席才能自评
if (reviewMode) {
v.put("canJoin", (unionIdList.contains(SecurityUtil.getUnionId()) && AuthUtil.hasRole(RoleConstant.BRANCH_UNION_ADMIN.name())));
} else {
v.put("canJoin", unionIdList.contains(SecurityUtil.getUnionId()));
}
}
});
return Result.success().addData(pagination);
}
@At
@ApiOperation("判断当前用户是否已经评价")
@SaCheckPermission("workershome.review.doReview")
public Object getPeoId(String id){
WorkersHomeReviewPeo peo = commentZbService.dao().fetch(WorkersHomeReviewPeo.class, Cnd.where("zbId", "=", id).and("userId", "=", SecurityUtil.getUserId()));
return Result.success().addData(peo.getId());
}
}
@@ -0,0 +1,267 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.review;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.ZipUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewExport;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.util.IOUtils;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
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.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 javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @ClassName exportZpController
* @Description TODO
* @Author zhf
* @Date 2023/9/6 17:09
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工评议-导出")
@At("/platform/workershome/review/export")
public class WorkersHomeReviewExportController {
// @Inject
// private OfficeTemplateUtil officeTemplateUtil;
@Inject
private Dao dao;
@Inject
private CommentZbService zbService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/unionComment/exportZp.html")
@SaCheckPermission("workerhome.review.export")
public void index() {}
@At
@ApiOperation("获取列表")
@SaCheckPermission("workerhome.review.export")
public Result pageData(@Param("annual") Integer annual,
int pageNumber, int pageSize) {
Sql sql = Sqls.create("SELECT YEAR(e.createTime) annual,e.* FROM `comment_export` e $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(e.createTime)", "=", annual);
sql.setCondition(cnd);
Pagination pagination = zbService.listPageMap(pageNumber, pageSize, sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("获取指标列表")
@SaCheckPermission("workerhome.review.export")
public Result getZbData(@Param("annual") String annual, @Param("assessment") String assessment) {
Sql sql = Sqls.create("SELECT * FROM `comment_zb` $condition");
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(annual) && Strings.isNotBlank(annual)) {
cnd.and("annual", "=", annual);
}
if (Strings.isNotBlank(assessment) && Strings.isNotBlank(assessment)) {
cnd.where().andLike("assessment", assessment);
} else {
cnd.desc("annual");
}
sql.setCondition(cnd);
List<NutMap> list = zbService.listMap(sql);
return Result.success().addData(list);
}
@At
@ApiOperation("添加导出内容")
@SaCheckPermission("workerhome.review.export")
public Result doAddExport(@Param("export") WorkersHomeReviewExport export) {
export.setCreateTime(DateUtil.now());
if (StrUtil.isNotBlank(export.getId())) {
zbService.updateIgnoreNull(export);
} else {
zbService.insert(export);
}
return null;
}
@At
@ApiOperation("删除导出内容")
@SaCheckPermission("workerhome.review.export")
@SLog(tag = "删除导出内容", msg = "删除到处内容id: ${args[0]}")
public Result doDelete(String id) {
zbService.dao().delete(WorkersHomeReviewExport.class, id);
return Result.success();
}
@At
@ApiOperation("获取导出内容")
@SaCheckPermission("workerhome.review.export")
public Result findOne(String id) {
WorkersHomeReviewExport export = zbService.dao().fetch(WorkersHomeReviewExport.class, id);
List<WorkersHomeReviewProxy> zbList = zbService.query(Cnd.NEW().and("id", "in", export.getProxyIds()).asc("assessmentMode"));
Map<String, Object> data = Map.of("export", export, "zbList", zbList);
return Result.success().addData(data);
}
@At
@Ok("void")
@ApiOperation("导出")
@SaCheckPermission("workerhome.review.export")
public void doExport(String id, HttpServletResponse response) throws Exception {
WorkersHomeReviewExport export = zbService.dao().fetch(WorkersHomeReviewExport.class, id);
//查询测评有那几个工会测评过
Sql sql = Sqls.create("""
SELECT
un.id,
un.unionname unionName,
count( peo.id ) num
FROM
sys_union un
LEFT JOIN `user` u ON u.unionId = un.id
LEFT JOIN comment_peo peo ON peo.userId = u.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("peo.zbId", "in", export.getProxyIds());
cnd.groupBy("un.id");
cnd.desc("count( peo.id )");
sql.setCondition(cnd);
List<NutMap> unionMap = zbService.listMap(sql);
List<WorkersHomeReviewProxy> zbs = zbService.query(Cnd.NEW().and("id", "in", export.getProxyIds()).asc("assessmentMode"));
//创建临时文件夹
Path templateDir = Files.createTempDirectory("评测结果文件夹");
//循环分工会
for (NutMap un : unionMap) {
List<View_user> users = zbService.dao().query(View_user.class, Cnd.where("unionId", "=", un.getString("id")));
FileOutputStream outputStream = new FileOutputStream(templateDir.toString() + "/" + un.getString("unionName") + "基层工会会员评家民主测评结果报告表.docx");
List<NutMap> zpxxList = new ArrayList<>();
for (WorkersHomeReviewProxy zb : zbs) {
Sql sqlps = Sqls.create("""
SELECT
SUM( CASE WHEN cp.reviewResult = '不满意' THEN 1 ELSE 0 END ) AS bmy,
SUM( CASE WHEN cp.reviewResult = '基本满意' THEN 1 ELSE 0 END ) AS jbmy,
SUM( CASE WHEN cp.reviewResult = '满意' THEN 1 ELSE 0 END ) AS my
FROM
comment_peo cp
LEFT JOIN `user` u ON u.id = cp.userId
$condition
""");
Cnd cndPs = Cnd.NEW();
cndPs.and("u.unionId", "=", un.getString("id"));
cndPs.and("cp.zbId", "=", zb.getId());
sqlps.setCondition(cndPs);
if (zb.getAssessmentMode() == 1) {
NutMap zpxx = new NutMap();
sqlps.setCallback(Sqls.callback.map());
dao.execute(sqlps);
NutMap psMap = (NutMap) sqlps.getResult();
zpxx.setv("pcdx", "工会工作及职工之家建设情况测评");
zpxx.setv("my", psMap.getInt("my"));
zpxx.setv("jbmy", psMap.getInt("jbmy"));
zpxx.setv("bmy", psMap.getInt("bmy"));
zpxxList.add(zpxx);
} else {
NutMap zpxxZx = new NutMap();
Cnd clone = cndPs.clone();
sqlps.setCondition(clone);
clone.and("cp.evaluatedPersonType", "=", "分工会主席");
sqlps.setCallback(Sqls.callback.map());
dao.execute(sqlps);
NutMap psMap = (NutMap) sqlps.getResult();
zpxxZx.setv("pcdx", "工会主席履职情况测评");
zpxxZx.setv("my", psMap.getInt("my"));
zpxxZx.setv("jbmy", psMap.getInt("jbmy"));
zpxxZx.setv("bmy", psMap.getInt("bmy"));
zpxxList.add(zpxxZx);
NutMap zpxxFzx = new NutMap();
Cnd clone2 = cndPs.clone();
clone2.and("cp.evaluatedPersonType", "=", "分工会副主席");
sqlps.setCondition(clone2);
sqlps.setCallback(Sqls.callback.map());
dao.execute(sqlps);
NutMap psMap2 = (NutMap) sqlps.getResult();
zpxxFzx.setv("pcdx", "工会副主席履职情况测评");
zpxxFzx.setv("my", psMap2.getInt("my"));
zpxxFzx.setv("jbmy", psMap2.getInt("jbmy"));
zpxxFzx.setv("bmy", psMap2.getInt("bmy"));
zpxxList.add(zpxxFzx);
}
}
// HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
// HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
// htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
//
// Configure config = Configure.newBuilder().bind("zpxxList", policy).build();
HashMap<String, Object> map = new HashMap<>();
map.put("zpxxList", zpxxList);
map.put("unionName", un.getString("unionName"));
map.put("num", users.size());
map.put("memberNum", users.stream().filter(v -> v.getMember() == 1).collect(Collectors.toList()).size());
// XWPFTemplate.compile(officeTemplateUtil.getPath("unionComment"), config).render(map).writeAndClose(outputStream);
outputStream.close();
}
//压缩
File zipFile = ZipUtil.zip(templateDir.toString());
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(zipFile.getName(), "UTF-8"));
try (ServletOutputStream outputStream = response.getOutputStream();
FileInputStream zipFis = new FileInputStream(zipFile);) {
IOUtils.copy(zipFis, outputStream);
} catch (Exception e) {
e.printStackTrace();
} finally {
FileUtil.del(templateDir);
FileUtil.del(zipFile);
}
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.review;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import io.swagger.annotations.ApiOperation;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.ioc.aop.Aop;
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 org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @ClassName addZbController
* @Description TODO
* @Author zhf
* @Date 2023/9/4 15:42
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工评议-添加考核指标")
@At("/platform/workershome/review/proxy")
public class WorkersHomeReviewProxyController {
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/review/xjkhzb.html")
@SaCheckPermission("workershome.review.proxy")
public void index() {
}
@Inject
private CommentZbService commentZbService;
@At
@ApiOperation("添加指标")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("workershome.review.proxy")
public Result doAdd(@Param("kh_zb") WorkersHomeReviewProxy commentZb) {
WorkersHomeReviewProxy zb = commentZbService.insert(commentZb);
for (WorkersHomeReviewContent nr : commentZb.getReviewContents()) {
nr.setProxyId(zb.getId());
nr.getReviewNorms().forEach(v->v.setProxyId(zb.getId()));
commentZbService.insertWith(nr, "bzs");
}
commentZbService.setGrading(zb);
return Result.success();
}
@At
@ApiOperation("获取指标列表")
public Result getZbList(Integer year) {
List<WorkersHomeReviewProxy> annual = commentZbService.query(Cnd.NEW().andEX("annual", "=", year));
return Result.success(annual);
}
}
@@ -0,0 +1,441 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.review;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewGrading;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentPeoService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentStatisticsService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.io.IOUtils;
import org.nutz.boot.starter.ftp.FtpService;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
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 javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @ClassName statisticsController
* @Description TODO
* @Author zhf
* @Date 2023/9/5 15:58
*/
@IocBean
@Ok("json:full")
@ApiOperation("职工评议-统计")
@At("/platform/workershome/review/statistics")
public class WorkersHomeReviewStatistics {
@Inject
private Dao dao;
@Inject
private FtpService ftpService;
@Inject
private CommentZbService commentZbService;
@Inject
private CommentPeoService commentPeoService;
@Inject
private CommentStatisticsService commentStatisticsService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/review/statistics.html")
@SaCheckPermission("workershome.review.statistics")
public void index() {
}
@At
@ApiOperation("获取列表")
@SaCheckPermission("workershome.review.statistics")
public Result pageData(PageForm page,
@Param("zbId") String zbId,
@Param("unionId") String unionId) {
WorkersHomeReviewProxy zb = commentPeoService.dao().fetch(WorkersHomeReviewProxy.class, Cnd.where("id", "=", zbId));
Sql sql = Sqls.create("""
SELECT
un.id,
un.unionname unionName,
IFNULL(grading.gradingName,'未定级') AS gradingName,
grading.isGrading,
count( peo.id ) num
FROM
sys_union un
LEFT JOIN `user` u ON u.unionId = un.id
LEFT JOIN comment_peo peo ON peo.userId = u.id AND peo.zbId = @zbId
LEFT JOIN comment_union_grading grading on un.id = grading.unionId AND grading.zbId = @zbId
$condition
""").setParam("zbId", zbId);
Cnd cnd = Cnd.NEW();
if (Lang.isNotEmpty(zb.getUnionIds())) {
cnd.and("un.id", "in", zb.getUnionIds());
} else {
if (AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.andEX("un.id", "=", unionId);
} else {
cnd.and("un.id", "=", SecurityUtil.getUnionId());
}
}
cnd.groupBy("un.id");
cnd.desc("count( peo.id )");
sql.setCondition(cnd);
Pagination pagination = commentZbService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("获取个人评议或工会评议列表")
@SaCheckPermission("workershome.review.statistics")
public Result getUserPeoByZbIdOrUnionId(PageForm page,
@Param("zbId") String zbId,
@Param("unionId") String unionId,
@Param("reviewResult") String reviewResult) {
Sql sql = Sqls.create("""
SELECT
peo.*,
u.loginname loginName,
unitname unitName
FROM
comment_peo peo
LEFT JOIN `user` u ON u.id = peo.userId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("peo.zbId", "=", zbId);
cnd.andEX("u.unionId", "=", unionId);
cnd.andEX("peo.reviewResult", "=", reviewResult);
if (StrUtil.isNotBlank(page.getSearchKeyword())) {
SqlExpressionGroup sqlExpressionGroup = new SqlExpressionGroup();
sqlExpressionGroup.orLike("u.loginname", page.getSearchKeyword());
sqlExpressionGroup.orLike("u.username", page.getSearchKeyword());
cnd.and(sqlExpressionGroup);
}
sql.setCondition(cnd);
Pagination pagination = commentZbService.listPageMap(page.getPageNumber(), page.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("根据id获取评测内容")
@SaCheckPermission("workershome.review.statistics")
public Result getBzById(String peoId) {
NutMap map = commentPeoService.getBzById(peoId);
return Result.success(map);
}
@At
@ApiOperation("获取评价结果数量")
@SaCheckPermission("workershome.review.statistics")
public Result getReviewResultNum(@Param("zbId") String zbId,
@Param("unionId") String unionId) {
Sql sql = Sqls.create("""
SELECT
SUM( CASE WHEN cp.reviewResult = '非常满意' THEN 1 ELSE 0 END ) AS fcmy,
SUM( CASE WHEN cp.reviewResult = '满意' THEN 1 ELSE 0 END ) AS my,
SUM( CASE WHEN cp.reviewResult = '良好' THEN 1 ELSE 0 END ) AS lh,
SUM( CASE WHEN cp.reviewResult = '一般' THEN 1 ELSE 0 END ) AS yb
FROM
comment_peo cp
LEFT JOIN `user` u ON u.id = cp.userId
WHERE
cp.zbId = @zbId
AND u.unionId = @unionId
""").setParam("zbId", zbId).setParam("unionId", unionId);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap mapList = (NutMap) sql.getResult();
return Result.success(mapList);
}
/**
* 分工会自评导出(单个)
*
* @param zbId
* @param unionId
* @param response
*/
@At
@Ok("void")
@ApiOperation("分工会自评导出(单个)")
@SaCheckPermission("workershome.review.statistics")
public void doDownLoadSingleByUnionId(String zbId, String unionId, HttpServletResponse response) {
WorkersHomeReviewPeo peo = commentZbService.dao().fetch(WorkersHomeReviewPeo.class, Cnd.where("unionId", "=", unionId).and("zbId", "=", zbId));
String fileName = peo.getUnionName() + "(" + peo.getUserName() + ")“模范教工小家”评议结果";
try {
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\".docx");
commentStatisticsService.exportWord(peo, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 分工会下所有测评结果导出(多个)压缩包
*
* @param zbId
* @param unionId
* @param response
*/
@At
@Ok("void")
@ApiOperation("分工会下所有测评结果导出(多个)压缩包")
@SaCheckPermission("workershome.review.statistics")
public void doDownLoadZipByUnionId(String zbId, String unionId, HttpServletResponse response) {
try {
List<WorkersHomeReviewPeo> peoList = commentPeoService.dao().query(WorkersHomeReviewPeo.class, Cnd.where("unionId", "=", unionId).and("zbId", "=", zbId));
WorkersHomeReviewPeo commentPeo = peoList.stream().findFirst().orElse(new WorkersHomeReviewPeo());
String zipName = commentPeo.getUnionName() + "评议结果.zip";
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipName, "UTF-8"));
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
for (WorkersHomeReviewPeo peo : peoList) {
String fileName = peo.getUnionName() + "(" + peo.getUserName() + ")“模范教工小家”评议结果.docx";
zipOutputStream.putNextEntry(new ZipEntry(fileName));
commentStatisticsService.exportWord(peo, zipOutputStream);
zipOutputStream.closeEntry();
response.flushBuffer();
}
zipOutputStream.flush();
zipOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 校验是否有附件
*
* @param peoId 测评结果Id
* @param zbId 指标Id
* @param unionId 分工会Id
* @return
*/
@At
@ApiOperation("校验是否有附件")
@SaCheckPermission("workershome.review.statistics")
public Result validateHasFiles(@Param("peoId") String peoId,
@Param("zbId") String zbId,
@Param("unionId") String unionId) {
Cnd cnd = Cnd.NEW();
cnd.andEX("id", "=", peoId);
cnd.andEX("zbId", "=", zbId);
cnd.andEX("unionId", "=", unionId);
List<WorkersHomeReviewPeo> peoList = commentPeoService.dao().query(WorkersHomeReviewPeo.class, cnd);
List<Sys_file> files;
try {
files = peoList.stream().flatMap(v -> v.getFiles().stream()).toList();
} catch (NullPointerException e) {
return Result.error();
}
if (Lang.isEmpty(files)) {
return Result.error();
} else {
return Result.success();
}
}
/**
* 分工会导出附件
*
* @param zbId
* @param unionId
* @param response
*/
@At
@Ok("void")
@ApiOperation("分工会导出附件")
@SaCheckPermission("workershome.review.statistics")
public void exportFilesByUnionId(String zbId, String unionId, HttpServletResponse response) {
List<WorkersHomeReviewPeo> peoList = commentPeoService.dao().query(WorkersHomeReviewPeo.class, Cnd.where("unionId", "=", unionId).and("zbId", "=", zbId));
WorkersHomeReviewPeo commentPeo = peoList.stream().findFirst().orElse(new WorkersHomeReviewPeo());
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
String tmpPath = "tmp/" + R.UU32();
File tmpDir = new File(tmpPath + "/附件信息");
tmpDir.mkdirs();
try {
for (WorkersHomeReviewPeo peo : peoList) {
String fileName = peo.getUnionName() + "(" + peo.getUserName() + ")";
List<Sys_file> files = peo.getFiles();
File tDir = new File(tmpDir + "/" + fileName);
tDir.mkdirs();
if (Lang.isNotEmpty(files)) {
// for (Sys_file file : files) {
// if (Lang.isNotEmpty(file)) {
// FileOutputStream outputStream = new FileOutputStream(tDir.getPath() + "/" + file.getFilename());
// ftpService.download(file.getFilepath(), outputStream);
// outputStream.close();
// }
// }
}
}
String aimsDir = "zipTmp/" + R.UU32();
String aimsName = commentPeo.getUnionName() + "评议信息.zip";
String aimsPath = aimsDir + "/" + aimsName;
// FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(aimsName, "UTF-8"));
File aimsFile = new File(aimsPath);
FileInputStream inputStream = new FileInputStream(aimsFile);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();
aimsFile.delete();
// FileUtil.deleteDir(new File(tmpPath));
// FileUtil.deleteDir(new File(aimsDir));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 个人上传附件导出
*
* @param peoId
* @param response
*/
@At
@Ok("void")
@ApiOperation("个人上传附件导出")
@SaCheckPermission("workershome.review.statistics")
public void exportFilesByPeoId(String peoId, HttpServletResponse response) {
WorkersHomeReviewPeo peo = commentPeoService.dao().fetch(WorkersHomeReviewPeo.class, peoId);
List<Sys_file> files = peo.getFiles();
response.reset();
response.setContentType("application/x-msdownload;charset=utf-8");
String tmpPath = "tmp/" + R.UU32();
File tmpDir = new File(tmpPath + "/个人附件信息");
tmpDir.mkdirs();
try {
for (Sys_file file : files) {
// if (Lang.isNotEmpty(files)) {
// FileOutputStream out = new FileOutputStream(tmpDir.getPath() + "/" + file.getFilename());
// ftpService.download(file.getFilepath(), out);
// out.close();
// }
}
String aimsDir = "zipTmp/" + R.UU32();
String aimsName = peo.getUnionName() + "(" + peo.getUserName() + ")个人附件信息.zip";
String aimsPath = aimsDir + "/" + aimsName;
// FileUtil.compressToZip(tmpDir.getPath(), aimsDir, aimsName);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(aimsName, "UTF-8"));
File aimsFile = new File(aimsPath);
FileInputStream inputStream = new FileInputStream(aimsFile);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();
aimsFile.delete();
// FileUtil.deleteDir(new File(tmpPath));
// FileUtil.deleteDir(new File(aimsDir));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 个人评议结果导出(得分)
*
* @param peoId
* @param response
*/
@At
@Ok("void")
@ApiOperation("个人评议结果导出(得分)")
@SaCheckPermission("workershome.review.statistics")
public void exportByPeoId(String peoId, HttpServletResponse response) {
WorkersHomeReviewPeo peo = commentPeoService.dao().fetch(WorkersHomeReviewPeo.class, peoId);
String fileName = peo.getUnionName() + "(" + peo.getUserName() + ")“模范教工小家”评议结果";
try {
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\".docx");
commentStatisticsService.exportWord(peo, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 导出所有分工会评议结果和附件信息
*
* @param zbId
* @param response
*/
@At
@Ok("void")
@SaCheckPermission("workershome.review.statistics")
public void exportAllUnions(String zbId, HttpServletResponse response) {
// List<CommentPeo> peoList = commentPeoService.dao().query(CommentPeo.class, Cnd.where("zbId", "=", zbId));
// Map<String, List<CommentPeo>> collect = peoList.stream().collect(Collectors.groupingBy(CommentPeo::getUnionId));
}
@At
@ApiOperation("评级")
@SaCheckPermission("workershome.review.statistics")
public Result doGrading(WorkersHomeReviewGrading grading){
if (StrUtil.isAllBlank(grading.getProxyId(),grading.getUnionId(),grading.getGradingName())) {
return Result.error("必要参数为空");
}
commentPeoService.dao().update(WorkersHomeReviewGrading.class,
Chain.make("isGrading",true).add("gradingName",grading.getGradingName()).add("gradingTime", DateUtil.now()),
Cnd.where("zbId","=",grading.getProxyId()).and("unionId","=",grading.getUnionId()));
return Result.success();
}
}
@@ -0,0 +1,165 @@
package com.budwk.app.zhgh.dayofficework.workershome.controller.review;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentBzService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentNrService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import io.swagger.annotations.ApiOperation;
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.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.lang.Lang;
import org.nutz.lang.Strings;
import org.nutz.lang.random.R;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import java.util.List;
/**
* @ClassName viewZbController
* @Description TODO
* @Author zhf
* @Date 2023/9/4 16:00
*/
@IocBean
@Ok("json:full")
@ApiOperation("指标查看")
@At("/platform/workershome/review/view")
public class WorkersHomeReviewViewController {
@Inject
private CommentZbService commentZbService;
@Inject
private CommentNrService commentNrService;
@Inject
private CommentBzService commentBzService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/workershome/review/khzb.html")
@SaCheckPermission("workerhome.review.view")
public void index() {
}
@At
@ApiOperation("指标查看分页数据")
@SaCheckPermission("workerhome.review.view")
public Result pageData(@Param("annual") String annual,
@Param("assessment") String assessment,
int pageNumber, int pageSize) {
Sql sql = Sqls.create("SELECT * FROM `comment_zb` $condition");
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(annual) && Strings.isNotBlank(annual)) {
cnd.and("annual", "=", annual);
}
if (Strings.isNotBlank(assessment) && Strings.isNotBlank(assessment)) {
cnd.where().andLike("assessment", assessment);
} else {
cnd.desc("annual");
}
sql.setCondition(cnd);
Pagination pagination = commentZbService.listPageMap(pageNumber, pageSize, sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("指标删除")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("workerhome.review.view")
@SLog(tag = "指标删除", msg = "指标删除id: ${args[0]}")
public Result delete(String id) {
commentZbService.delete(id);
List<WorkersHomeReviewContent> query = commentNrService.query(Cnd.where("zb_id", "=", id));
if (Lang.isNotEmpty(query)) {
List<String> nrIds = query.stream().map(WorkersHomeReviewContent::getId).toList();
commentBzService.clear(Cnd.where("nr_id", "in", nrIds));
}
commentNrService.clear(Cnd.where("zb_id", "=", id));
return Result.success();
}
@At
@ApiOperation("获取编辑内容")
@SaCheckPermission("workerhome.review.view")
@SLog(tag = "获取编辑内容", msg = "编辑内容id: ${args[0]}")
public Result edit(String id) {
WorkersHomeReviewProxy khzb = commentZbService.khzb(id);
return Result.success().addData(khzb);
}
@At
@ApiOperation("指标编辑")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("workerhome.review.view")
@SLog(tag = "指标编辑", msg = "指标编辑id: ${args[0]}")
public Result doEdit(@Param("kh_zb") WorkersHomeReviewProxy commentZb) {
commentZbService.updateIgnoreNull(commentZb);
List<WorkersHomeReviewContent> query = commentNrService.query(Cnd.where("zb_id", "=", commentZb.getId()));
if (Lang.isNotEmpty(query)) {
List<String> nrIds = query.stream().map(WorkersHomeReviewContent::getId).toList();
commentBzService.clear(Cnd.where("nr_id", "in", nrIds));
}
commentNrService.clear(Cnd.where("zb_id", "=", commentZb.getId()));
List<WorkersHomeReviewContent> nrs = commentZb.getReviewContents();
if (Lang.isNotEmpty(nrs)){
nrs.forEach(v->{
if (v.getId() == null) {
v.setId(R.UU32());
}
Chain chain = Chain.make("id", v.getId());
chain.add("zb_id",commentZb.getId());
chain.add("content",v.getContent());
chain.add("contentNumber",v.getContentNumber());
chain.add("remark",v.getRemark());
commentNrService.dao().insert(WorkersHomeReviewContent.class, chain);
List<WorkersHomeReviewNorm> bzs = v.getReviewNorms();
bzs.forEach(b->{
if (b.getId() == null) {
b.setId(R.UU32());
}
Chain bzChain = Chain.make("id", b.getId());
bzChain.add("nr_id",v.getId());
bzChain.add("inspection",b.getInspection());
bzChain.add("score",b.getScore());
bzChain.add("single_score",b.getSingleScore());
bzChain.add("zb_id",commentZb.getId());
bzChain.add("contentNumber",b.getContentNumber());
commentNrService.dao().insert(WorkersHomeReviewNorm.class, bzChain);
});
});
}
commentZbService.setGrading(commentZb);
return Result.success();
}
}
@@ -0,0 +1,301 @@
package com.budwk.app.zhgh.dayofficework.workershome.h5controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewResult;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentPeoService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import com.budwk.app.zhgh.dayofficework.workershome.vo.WakesHomeVo;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.Static;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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.stream.Collectors;
@IocBean
@At("/mobile/workershome/review/appraisal")
@Ok("json:full")
public class MWorkersHomeReviewController {
@Inject
private CommentZbService commentZbService;
@Inject
private BaseService baseService;
@Inject
private CommentPeoService commentPeoService;
@At
@Ok("beetl:/mobile/workershome/review/appraisal.html")
@SaCheckLogin
public void index() {
}
@At
@Ok("beetl:/mobile/workershome/review/commentator.html")
@SaCheckLogin
public void commentator() {
}
@At
@Ok("beetl:/mobile/workershome/review/mine.html")
@SaCheckLogin
public void mine() {
}
/**
* 民主测评首页展示
*
* @param pageForm
* @param annual
* @return
*/
@At
@SaCheckPermission
public Object pageData(PageForm pageForm,
@Param("annual") String annual,
@Param("type") Integer type) {
Sql sql = Sqls.create("SELECT * FROM `comment_zb` $condition");
Cnd cnd = Cnd.NEW();
if (Strings.isNotBlank(annual) && Strings.isNotBlank(annual)) {
cnd.and("annual", "=", annual);
}
switch (type) {
//进行中
case 2 -> cnd.and(new Static("now() >= startTime and now() <= endTime"));
//已结束
case 3 -> cnd.and(new Static("now() > endTime"));
//未开始
case 4 -> cnd.and(new Static("now() < startTime"));
}
sql.setCondition(cnd);
Pagination pagination = commentZbService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
List<NutMap> list = pagination.getList();
List<Sys_union> unionList = commentZbService.dao().query(Sys_union.class, Cnd.NEW());
list.forEach(v -> {
//自评模式
boolean reviewMode = v.getInt("reviewMode") == 1;
if (reviewMode && v.getInt("commentTarget") == 1) {
//校工会自评,判断有没有校工会管理员的权限
v.put("canJoin", AuthUtil.hasRole(RoleConstant.SCHOOL_UNION_ADMIN.name()));
} else if (reviewMode && v.getInt("commentTarget") == 2) {
//分工会自评,判断有没有分工会管理员
v.put("canJoin", AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name()));
}
//自选分工会的模式
if (StrUtil.isNotBlank(v.getString("unionIds"))) {
List<String> unionIdList = JSONUtil.parseArray(v.getString("unionIds")).toList(String.class);
String string = unionList.stream().filter(item -> unionIdList.contains(item.getId()))
.map(Sys_union::getName).collect(Collectors.joining(","));
v.put("unionNames", string);
//如果是自评,只有分工会主席才能自评
if (reviewMode) {
v.put("canJoin", (unionIdList.contains(SecurityUtil.getUnionId()) && AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())));
} else {
v.put("canJoin", unionIdList.contains(SecurityUtil.getUnionId()));
}
}
});
return pagination;
}
/**
* 根据id获取测评内容
*
* @param id
* @return
*/
@At
@SaCheckPermission
public Object getById(String id) {
return commentZbService.khzb(id);
}
@At
@Aop(TransAop.READ_COMMITTED)
public Object doSubmit(WakesHomeVo wakesHomeVo) {
try {
View_user user = baseService.dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
WorkersHomeReviewPeo peo = new WorkersHomeReviewPeo();
if (Strings.isNotBlank(wakesHomeVo.getEvaluatedPersonId())) {
peo.setEvaluatedPersonId(wakesHomeVo.getEvaluatedPersonId());
peo.setEvaluatedPersonName(wakesHomeVo.getEvaluatedPersonName());
peo.setEvaluatedPersonType(wakesHomeVo.getEvaluatedPersonType());
}
peo.setReviewResult(wakesHomeVo.getReviewResult());
peo.setProxyId(wakesHomeVo.getId());
peo.setReviewTime(DateUtil.now());
// peo.setFiles(wakesHomeVo.getFiles());
peo.setUserId(user.getId());
peo.setUserName(user.getUsername());
peo.setUnionId(user.getUnionId());
peo.setUnionName(user.getUnionName());
if (Strings.isNotBlank(wakesHomeVo.getPresidentOpinions())) {
peo.setPresidentOpinions(wakesHomeVo.getPresidentOpinions());
}
baseService.dao().insert(peo);
List<WorkersHomeReviewResult> commentResults = new ArrayList<>();
for (WorkersHomeReviewNorm v : wakesHomeVo.getBzList()) {
WorkersHomeReviewResult result = new WorkersHomeReviewResult();
result.setProxyId(v.getId());
result.setAssessResult(v.getResultScore());
result.setRecommendation(v.getOptions() != null ? v.getOptions() : null);
result.setPeoId(peo.getId());
commentResults.add(result);
}
baseService.dao().insert(commentResults);
return Result.success();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
/**
* 判断是否测评过
*
* @param id 指标id
* @param evaluatedPersonId 被测评人id
* @return
*/
@At
public Object isAssess(@Param("id") String id,
@Param("evaluatedPersonId") String evaluatedPersonId) {
//主席测评
if (Strings.isNotBlank(evaluatedPersonId)) {
Cnd cnd = Cnd.NEW();
cnd.and("evaluatedPersonId", "=", evaluatedPersonId);
cnd.and("userId", "=", SecurityUtil.getUserId());
cnd.and("zbId", "=", id);
return Result.success().addData(baseService.dao().count(WorkersHomeReviewPeo.class, cnd));
} else {//会员评家测评
Sql sql = Sqls.create("""
SELECT
cp.*,
cz.annual,
cz.assessment,
cz.assessmentMode,
cz.scoringMode,
cz.commentTarget
FROM
`comment_peo` cp
LEFT JOIN `comment_zb` cz ON cz.id = cp.zbId
where cp.zbId=@zbId and cp.userId=@userId
""").setParam("zbId", id).setParam("userId", SecurityUtil.getUserId());
List<NutMap> list = baseService.listMap(sql);
NutMap nutMap = list.stream().findFirst().orElse(null);
if (nutMap != null && Strings.isNotBlank(nutMap.getString("commentTarget")) && "1".equals(nutMap.getString("assessmentMode"))) {
return Result.success().addData(1);
} else {
return Result.success().addData(0);
}
}
}
/**
* 我的测评页面展示
*
* @param pageForm
* @param annual
* @return
*/
@At
public Object onLoad(PageForm pageForm,
@Param("annual") String annual) {
Sql sql = Sqls.create("""
SELECT
cp.*,
cz.annual,
cz.assessment,
cz.assessmentMode,
cz.scoringMode,
cz.commentTarget
FROM
`comment_peo` cp
LEFT JOIN `comment_zb` cz ON cz.id = cp.zbId
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("cz.annual", "=", annual);
cnd.and("cp.userId", "=", SecurityUtil.getUserId());
cnd.desc("cp.reviewTime");
sql.setCondition(cnd);
return baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
}
/**
* 获取测评结果信息
*
* @param peoId
* @return
*/
@At
public Object getBzById(@Param("peoId") String peoId) {
return commentPeoService.getBzById(peoId);
}
/**
* 获取分工会主席和副主席
*
* @return
*/
@At
public Object getPresidents() {
Sql sql = Sqls.create("""
SELECT
u.id,
u.loginname,
u.username,
sr.`name` evaluatedPersonType,
GROUP_CONCAT( DISTINCT u.username, '(', sr.`name`, ')' ) presidents
FROM
`user` u
LEFT JOIN `sys_user_role` sur ON u.id = sur.userId
LEFT JOIN `sys_role` sr ON sur.roleId = sr.id
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("sr.`code`", "in", List.of(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_VICE_CHAIRMAN.name()));
cnd.and("u.unionid", "=", SecurityUtil.getUnionId());
cnd.groupBy("u.id");
cnd.asc("u.loginname");
sql.setCondition(cnd);
return baseService.listMap(sql);
}
}
@@ -0,0 +1,130 @@
package com.budwk.app.zhgh.dayofficework.workershome.model;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.List;
/**
* @author mayn
*/
@Data
@Table
@Comment("职工小家-职工小家表")
@EqualsAndHashCode(callSuper = true)
public class WorkersHome extends BaseModel {
@Name
@Column
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("填报人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String username;
@Column
@Comment("联系方式")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String mobile;
@Column
@Comment("所属工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("填报时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String applyTime;
@Column
@Comment("填报类别(校工会/分工会)")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String category;
@Column
@Comment("创办时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String foundTime;
@Column
@Comment("单位位置")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String position;
@Column
@Comment("单位面积")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String area;
@Column
@Comment("单位信息")
@ColDefine(type = ColType.TEXT)
private String details;
@Column
@Comment("获奖情况")
@ColDefine(type = ColType.MYSQL_JSON)
private List<AwardInfo> awardInfo;
@Column
@Comment("图片文件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> picFiles;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Column
@Comment("分工会审核id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionAuditId;
@Column
@Comment("校工会审核id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String schoolAuditId;
@Column
@Comment("状态")
@ColDefine(type = ColType.INT)
private Integer state;
@Data
public static class AwardInfo implements Serializable {
/**
* 获奖日期
*/
private String awardTime;
/**
* 获奖单位
*/
private String awardUnit;
/**
* 奖项名称
*/
private String awardName;
/**
* 奖项照片
*/
private String awardPic;
}
}
@@ -0,0 +1,130 @@
package com.budwk.app.zhgh.dayofficework.workershome.model;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.io.Serializable;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameWakesHomeApply
* @Date 2024/7/31 10:47
* @注释 职工之家申报
*/
@Data
@Table
@Comment("职工之家申报")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeApply extends BaseModel implements Serializable {
private static final long serialVersionUID = 1L;
@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 = 50)
private String loginName;
@Column
@Comment("申报人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String username;
@Column
@Comment("申报人单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("申报人单位名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unitName;
@Column
@Comment("申报人工会Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("申报人工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("联系电话")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String mobile;
@Column
@Comment("基本情况简介(500字内)")
@ColDefine(type = ColType.TEXT)
private String basicInformation;
@Column
@Comment("建设方案")
@ColDefine(type = ColType.TEXT)
private String constructionPlan;
@Column
@Comment("基层党组织审核Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String organizationAuditId;
@Column
@Comment("校工会审核Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String schoolAuditId;
//10000待提交;10010待基层党组织审核;10020待校工会审核;10030审核通过
@Column
@Comment("当前状态")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String state;
@Column
@Comment("申报时间")
@ColDefine(type = ColType.DATE)
private String applyDate;
@Column
@Comment("创办时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String foundTime;
@Column
@Comment("单位位置")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String position;
@Column
@Comment("单位面积")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String area;
@Column
@Comment("单位信息")
@ColDefine(type = ColType.TEXT)
private String details;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
}
@@ -0,0 +1,95 @@
package com.budwk.app.zhgh.dayofficework.workershome.model;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_file;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
/**
* @version 1.0
* @Author zzr
* @nameWakesHomeDataRevel
* @Date 2024/7/30 15:29
* @注释 职工建家资料管理
*/
@Data
@Table
@Comment("职工建家资料管理")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeDataRevel extends BaseModel {
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("资料名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String revelName;
@Column
@Comment("上传人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("上传人工号")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String loginName;
@Column
@Comment("上传人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String username;
@Column
@Comment("上传人单位id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("上传人单位名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unitName;
@Column
@Comment("上传人工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("上传人工会名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unionName;
@Column
@Comment("资料归属分工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String belongToUnionId;
@Column
@Comment("资料归属分工会名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String belongToUnionName;
@Column
@Comment("上传时间")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String time;
@Column
@Comment("类型Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeId;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> files;
}
@@ -0,0 +1,43 @@
package com.budwk.app.zhgh.dayofficework.workershome.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author zzr
* @nameWakesHomeDataType
* @Date 2024/7/30 15:29
* @注释 职工建家资料类型管理
*/
@Data
@Table
@Comment("职工建家资料类型管理")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeDataType extends BaseModel {
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("类型编码")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String code;
@Column
@Comment("工作资料类型名称")
@ColDefine(type = ColType.VARCHAR, width = 80)
private String typeName;
@Column
@Comment("序号")
@ColDefine(type = ColType.INT)
private Integer serialNum;
}
@@ -0,0 +1,58 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @ClassName CommentNr
* @Description TODO
* @Author zhf
* @Date 2023/9/4 16:13
*/
@Data
@Table
@Comment("职工小家-评议内容")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewContent extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("考核内容")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String content;
@Column
@Comment("题号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String contentNumber;
@Column
@Comment("指标id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyId;
@One(field = "proxyId",key = "id")
private WorkersHomeReviewProxy reviewProxy;
@Many(field = "contentId")
private List<WorkersHomeReviewNorm> reviewNorms;
@Column
@Comment("排序字段")
private Integer location;
@Column
@Comment("备注")
@ColDefine(type = ColType.TEXT)
private String remark;
}
@@ -0,0 +1,49 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @ClassName CommentExport
* @Description TODO
* @Author zhf
* @Date 2023/9/7 15:19
*/
@Data
@Table
@Comment("职工小家-评议导出")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewExport extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("导出的名称")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String exportName;
// 指标id
@Column
@Comment("proxyIds")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> proxyIds;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String createTime;
}
@@ -0,0 +1,66 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.Date;
/**
* @version 1.0
* @Author zzr
* @nameCommentUnionGrading
* @Date 2024/9/19 8:48
* @注释 校工会给分工会定级
*/
@Data
@Table
@Comment("校工会给分工会定级表")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewGrading extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("考核指标id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyId;
@Column
@Comment("定级的分工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("分工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("分工会编码")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionCode;
@Column
@Comment("定级的名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String gradingName;
@Column
@Default("0")
@Comment("是否定级")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isGrading;
@Column
@Comment("定级时间")
@ColDefine(type = ColType.DATETIME)
private Date gradingTime;
}
@@ -0,0 +1,97 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
/**
* @ClassName CommentBz
* @Description TODO
* @Author zhf
* @Date 2023/9/4 16:24
* 职工小家评议标准
*/
@Data
@Table
@Comment("职工小家-评议标准")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewNorm extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("内容id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String contentId;
@Column
@Comment("考核标准")
@ColDefine(type = ColType.VARCHAR, width = 500)
private String inspection;
@Column
@Comment("是否启用佐证材料")
@ColDefine(type = ColType.BOOLEAN)
private boolean isEvidence;
@Column
@Comment("标准分")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String score;
@Column
@Comment("单项得分")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String singleScore;
@Column
@Comment("自评能否超过最高分")
@ColDefine(type = ColType.BOOLEAN)
private boolean beyondHighestScore;
@Column
@Comment("关联模块")
@ColDefine(type = ColType.VARCHAR,width = 100)
private String associatedModule;
@Column
@Comment("标准标识")
@ColDefine(type = ColType.VARCHAR,width = 100)
private String normRelationId;
@Column
@Comment("指标id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyId;
@Column
@Comment("题号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String contentNumber;
@Column
@Comment("排序字段")
private Integer location;
@Column
@Comment("能否删除该项")
@ColDefine(type = ColType.BOOLEAN)
private boolean canDelete;
@One(field = "contentId", key = "id")
private WorkersHomeReviewContent reviewContent;
private String resultScore;
private String options;
}
@@ -0,0 +1,93 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_file;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
/**
* @author mayn
*/
@Data
@Table
@Comment("职工小家-测评人记录")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewPeo extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("测评人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String userId;
@Column
@Comment("测评人姓名")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String userName;
@Column
@Comment("测评人工会id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unionId;
@Column
@Comment("测评人工会名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String unionName;
@Column
@Comment("被测评人id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String evaluatedPersonId;
@Column
@Comment("被测评人姓名")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String evaluatedPersonName;
@Column
@Comment("被测评人职务(主席/副主席)")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String evaluatedPersonType;
@Column
@Comment("指标id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyId;
@Column
@Comment("主席测评意见")
@ColDefine(type = ColType.TEXT)
private String presidentOpinions;
@Column
@Comment("评测结果")
@ColDefine(type = ColType.VARCHAR,width = 10)
private String reviewResult;
@Column
@Comment("测评时间")
@ColDefine(type = ColType.VARCHAR,width = 20)
private String reviewTime;
@Many(field = "peoId")
private List<WorkersHomeReviewResult> resultList;
@Column
@Comment("自我测评的附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<Sys_file> files;
}
@@ -0,0 +1,96 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.Date;
import java.util.List;
/**
* @ClassName CommentZb
* @Description TODO
* @Author zhf
* @Date 2023/9/4 15:39
* 评议指标
*/
@Data
@Table
@Comment("职工小家-评议指标")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewProxy extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("年度")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String annual;
@Column
@Comment("考核名称")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String assessment;
@Column
@Comment("添加时间")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String addTime;
@Column
@Comment("评议选项(1.工会评家2.主席评家)")
@ColDefine(type = ColType.INT)
private Integer assessmentMode;
@Column
@Comment("可报名范围组别")
@ColDefine(type = ColType.VARCHAR, width = 32)
private Integer activityGroupId;
@Column
@Comment("评议范围(1.校工会 2.全部分工会 3.自选分工会)")
@ColDefine(type = ColType.INT)
private Integer commentTarget;
@Column
@Comment("打分模式(1.评分模式2.选择满意不满意模式)")
@ColDefine(type = ColType.INT)
private Integer scoringMode;
@Many(field = "proxyId")
private List<WorkersHomeReviewContent> reviewContents;
@Column
@Comment("排序字段")
private Integer location;
@Column
@Comment("自选分工会Id")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> unionIds;
@Column
@Comment("评议开始时间")
@ColDefine(type = ColType.DATETIME)
private Date startTime;
@Column
@Comment("评议结束时间")
@ColDefine(type = ColType.DATETIME)
private Date endTime;
@Column
@Comment("评议模式(1.自评模式 2.教职工评议)")
@ColDefine(type = ColType.INT)
private Integer reviewMode;
}
@@ -0,0 +1,52 @@
package com.budwk.app.zhgh.dayofficework.workershome.model.review;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
/**
* @author mayn
*/
@Data
@Table
@Comment("职工小家-评测结果表")
@EqualsAndHashCode(callSuper = true)
public class WorkersHomeReviewResult extends BaseModel {
@Column
@Name
@Comment("id")
@ColDefine(type = ColType.VARCHAR, width = 32)
@Prev(els = {@EL("uuid()")})
private String id;
@Column
@Comment("测评人表id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String peoId;
@Column
@Comment("测评标准id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String proxyId;
@Column
@Comment("测评分数/满意度")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String assessResult;
@Column
@Comment("会员评家意见或建议")
@ColDefine(type = ColType.TEXT)
private String recommendation;
@One(field = "peoId",key = "id")
private WorkersHomeReviewPeo reviewPeo;
}
@@ -0,0 +1,28 @@
package com.budwk.app.zhgh.dayofficework.workershome.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import org.nutz.lang.util.NutMap;
/**
* @version 1.0
* @Author zzr
* @nameWorkersHomeApplyService
* @Date 2024/7/31 11:09
* @注释
*/
public interface WorkersHomeApplyService extends BaseService<WorkersHomeApply> {
/**
* 根据id获取信息
* @param id
* @return
*/
NutMap findById(String id);
/**
* 设置参数
* @param wakesHomeApply
*/
void setParams(WorkersHomeApply wakesHomeApply);
}
@@ -0,0 +1,7 @@
package com.budwk.app.zhgh.dayofficework.workershome.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHome;
public interface WorkersHomeInfoService extends BaseService<WorkersHome> {
}
@@ -0,0 +1,58 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHomeApply;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeApplyService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
/**
* @version 1.0
* @Author zzr
* @nameWakesHomeApplyServiceImpl
* @Date 2024/7/31 11:10
* @注释
*/
@IocBean(args = {"refer:dao"})
public class WorkersHomeApplyServiceImpl extends BaseServiceImpl<WorkersHomeApply> implements WorkersHomeApplyService {
public WorkersHomeApplyServiceImpl(Dao dao) {
super(dao);
}
@Override
public NutMap findById(String id) {
WorkersHomeApply apply = fetch(id);
NutMap nutMap = Lang.obj2nutmap(apply);
if (StrUtil.isNotBlank(apply.getOrganizationAuditId())) {
Audit audit = dao().fetch(Audit.class, Cnd.where("id", "=", apply.getOrganizationAuditId()));
nutMap.put("organizationAudit", Lang.obj2nutmap(audit));
}
if (StrUtil.isNotBlank(apply.getSchoolAuditId())) {
Audit audit = dao().fetch(Audit.class, Cnd.where("id", "=", apply.getSchoolAuditId()));
nutMap.put("schoolAudit", Lang.obj2nutmap(audit));
}
return nutMap;
}
@Override
public void setParams(WorkersHomeApply wakesHomeApply) {
View_user user = dao().fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
wakesHomeApply.setId(R.UU32());
wakesHomeApply.setApplyDate(DateUtil.today());
wakesHomeApply.setUnitId(user.getUnitId());
wakesHomeApply.setUnitName(user.getUnitName());
wakesHomeApply.setUnionId(user.getUnionId());
wakesHomeApply.setUnionName(user.getUnionName());
}
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.workershome.model.WorkersHome;
import com.budwk.app.zhgh.dayofficework.workershome.service.WorkersHomeInfoService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
@IocBean(args = {"refer:dao"})
public class WorkersHomeInfoServiceImpl extends BaseServiceImpl<WorkersHome> implements WorkersHomeInfoService {
public WorkersHomeInfoServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl.review;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentBzService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @ClassName CommentBzServiceImpl
* @Description TODO
* @Author zhf
* @Date 2023/9/4 16:30
*/
@IocBean(args = {"refer:dao"})
public class CommentBzServiceImpl extends BaseServiceImpl<WorkersHomeReviewNorm> implements CommentBzService {
public CommentBzServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl.review;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentNrService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @ClassName CommentNrServiceImpl
* @Description TODO
* @Author zhf
* @Date 2023/9/4 16:28
*/
@IocBean(args = {"refer:dao"})
public class CommentNrServiceImpl extends BaseServiceImpl<WorkersHomeReviewContent> implements CommentNrService {
public CommentNrServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,64 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl.review;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewResult;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentPeoService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.lang.util.NutMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@IocBean(args = {"refer:dao"})
public class CommentPeoServiceImpl extends BaseServiceImpl<WorkersHomeReviewPeo> implements CommentPeoService {
public CommentPeoServiceImpl(Dao dao) {super(dao);}
@Inject
private BaseService baseService;
@Inject
private CommentZbService commentZbService;
/**
* 获取测评结果信息
* @param peoId 指标id
* @return
*/
@Override
public NutMap getBzById(String peoId) {
WorkersHomeReviewPeo commentPeo = fetch(peoId);
List<WorkersHomeReviewResult> query = baseService.dao().query(WorkersHomeReviewResult.class, Cnd.where("peo_id","=",peoId));
//对测评标准分组
Map<String, WorkersHomeReviewResult> commentResultMap = query.stream().collect(Collectors.toMap(v -> v.getProxyId(), v -> v));
//获取指标
WorkersHomeReviewProxy khzb = commentZbService.khzb(commentPeo.getProxyId());
List<WorkersHomeReviewContent> nrs = khzb.getReviewContents();
nrs.forEach(v->{
v.getReviewNorms().forEach(o->{
//赋值测评结果
WorkersHomeReviewResult result = commentResultMap.get(o.getId());
if (Lang.isNotEmpty(result)){
o.setOptions(StrUtil.isNotBlank(result.getRecommendation()) ? result.getRecommendation() : "未填写此项");
o.setResultScore(result.getAssessResult());
}
});
});
NutMap nutMap = new NutMap();
nutMap.setv("zbxx",khzb);
nutMap.setv("commentPeo",commentPeo);
return nutMap;
}
}
@@ -0,0 +1,87 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl.review;
import cn.hutool.core.convert.Convert;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentPeoService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentStatisticsService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @version 1.0
* @Author zzr
* @nameCommentStatisticsServiceImpl
* @Date 2024/8/26 9:48
* @注释
*/
@IocBean(args = {"refer:dao"})
public class CommentStatisticsServiceImpl extends BaseServiceImpl<WorkersHomeReviewPeo> implements CommentStatisticsService {
public CommentStatisticsServiceImpl(Dao dao) {
super(dao);
}
@Inject
private CommentPeoService commentPeoService;
@Override
public void exportWord(WorkersHomeReviewPeo peo, OutputStream outputStream) {
NutMap map = commentPeoService.getBzById(peo.getId());
//最后的导出表
NutMap resultMap = NutMap.NEW();
List<NutMap> list = new ArrayList<>();
// resultMap.put("schoolName", Globals.schoolName);
WorkersHomeReviewProxy khzb = map.getAs("zbxx", WorkersHomeReviewProxy.class);
List<WorkersHomeReviewContent> nrs = khzb.getReviewContents();
nrs.forEach(v -> {
NutMap nutMap = NutMap.NEW();
List<WorkersHomeReviewNorm> bzs = v.getReviewNorms();
String nr = bzs.stream().sorted(Comparator.comparing(WorkersHomeReviewNorm::getContentNumber)).map(item -> {
return item.getContentNumber() + "." + item.getInspection() + "(" + item.getScore() + "分)";
}).collect(Collectors.joining("\n"));
int jf = bzs.stream().mapToInt(item -> Integer.parseInt(item.getScore())).sum();
int zpf = bzs.stream().mapToInt(item -> Integer.parseInt(item.getResultScore())).sum();
WorkersHomeReviewNorm commentBz = bzs.stream().findFirst().orElse(new WorkersHomeReviewNorm());
nutMap.put("xh", Convert.numberToChinese(Double.parseDouble(v.getContentNumber()), false));
nutMap.put("zb", v.getContent());
nutMap.put("nr", nr);
nutMap.put("jf", jf);
nutMap.put("zpf", zpf);
nutMap.put("bz", commentBz.getOptions());
list.add(nutMap);
});
// HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
// HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
// htmlRenderPolicy.getConfig().setShowDefaultTableBorderInTableCell(true);
//
// Configure config = Configure.newBuilder().bind("list", policy)
// .bind("list.nr", htmlRenderPolicy).build();
resultMap.put("list", list);
try {
// InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("docTemplate/workershome.docx");
// XWPFTemplate.compile(inputStream, config).render(resultMap, outputStream);
// inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,82 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.impl.review;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewGrading;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentNrService;
import com.budwk.app.zhgh.dayofficework.workershome.service.review.CommentZbService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.random.R;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName CommentZbServiceImpl
* @Description TODO
* @Author zhf
* @Date 2023/9/4 15:54
*/
@IocBean(args = {"refer:dao"})
public class CommentZbServiceImpl extends BaseServiceImpl<WorkersHomeReviewProxy> implements CommentZbService {
public CommentZbServiceImpl(Dao dao) {
super(dao);
}
@Inject
private CommentNrService commentNrService;
@Override
public WorkersHomeReviewProxy khzb(String zbid) {
if (StrUtil.isBlank(zbid)) {
return null;
}
WorkersHomeReviewProxy zb = dao().fetchLinks(fetch(zbid), "nrs", Cnd.NEW().asc("contentNumber"));
for (WorkersHomeReviewContent nr : zb.getReviewContents()) {
List<WorkersHomeReviewNorm> query = dao().query(WorkersHomeReviewNorm.class, Cnd.where("zb_id", "=", zbid).and("nr_id", "=", nr.getId()).asc("contentNumber"));
nr.setReviewNorms(query);
}
return zb;
}
@Override
public void setGrading(WorkersHomeReviewProxy commentZb) {
int count = dao().count(WorkersHomeReviewGrading.class, Cnd.where("zbId", "=", commentZb.getId()));
if (count > 0) {
dao().clear(WorkersHomeReviewGrading.class, Cnd.where("zbId", "=", commentZb.getId()));
}
if (ObjectUtil.isNotNull(commentZb.getCommentTarget()) && commentZb.getCommentTarget() != 1) {
List<Sys_union> query = new ArrayList<>();
if (commentZb.getCommentTarget() == 2) {
query = dao().query(Sys_union.class, Cnd.NEW());
} else if (commentZb.getCommentTarget() == 3) {
query = dao().query(Sys_union.class, Cnd.where("id", "in", commentZb.getUnionIds()));
}
List<WorkersHomeReviewGrading> commentUnionGradings = new ArrayList<>();
for (Sys_union union : query) {
WorkersHomeReviewGrading unionGrading = new WorkersHomeReviewGrading();
unionGrading.setId(R.UU32());
unionGrading.setUnionId(union.getId());
unionGrading.setProxyId(commentZb.getId());
unionGrading.setUnionName(union.getName());
unionGrading.setUnionCode(union.getUnionCode());
unionGrading.setIsGrading(false);
unionGrading.setGradingTime(null);
commentUnionGradings.add(unionGrading);
}
dao().insert(commentUnionGradings);
}
}
}
@@ -0,0 +1,8 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.review;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewNorm;
public interface CommentBzService extends BaseService<WorkersHomeReviewNorm> {
}
@@ -0,0 +1,8 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.review;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewContent;
public interface CommentNrService extends BaseService<WorkersHomeReviewContent> {
}
@@ -0,0 +1,16 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.review;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import org.nutz.lang.util.NutMap;
public interface CommentPeoService extends BaseService<WorkersHomeReviewPeo> {
/**
* 根据指标id和被测评人id查测评结果
* @param peoId 指标id
* @return
*/
NutMap getBzById(String peoId);
}
@@ -0,0 +1,22 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.review;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewPeo;
import java.io.OutputStream;
/**
* @version 1.0
* @Author zzr
* @nameCommentStatisticsService
* @Date 2024/8/26 9:47
* @注释
*/
public interface CommentStatisticsService extends BaseService<WorkersHomeReviewPeo> {
void exportWord(WorkersHomeReviewPeo peo, OutputStream outputStream);
}
@@ -0,0 +1,13 @@
package com.budwk.app.zhgh.dayofficework.workershome.service.review;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.workershome.model.review.WorkersHomeReviewProxy;
public interface CommentZbService extends BaseService<WorkersHomeReviewProxy> {
WorkersHomeReviewProxy khzb(String zbid);
void setGrading(WorkersHomeReviewProxy zb);
}

Some files were not shown because too many files have changed in this diff Show More