Compare commits

...

10 Commits

Author SHA1 Message Date
TS-QD1
07f2a8b32d feat: 百度支付、新登录页面 2025-05-30 17:57:31 +08:00
1215525055@qq.com
45eb9b07a9 增加了用户余额线下扣款 , 套餐包线下核销功能 2025-05-16 14:30:36 +08:00
1215525055@qq.com
92e272664c 增加开票信息复制 2025-05-12 16:47:48 +08:00
1215525055@qq.com
1cf29cf091 在对公转账审核中 , 减少了对 user_info的调用 2025-05-08 14:05:32 +08:00
1215525055@qq.com
d0d951b016 在对公转账审核中 , 减少了对 user_info的调用 2025-05-08 11:20:52 +08:00
1215525055@qq.com
5359aa2e9c 修改了发票信息管理的模糊查询
增加了优惠券的批量激活 , 与批量短信整合发送
2025-05-06 16:03:26 +08:00
1215525055@qq.com
0adb6b3bfd 修改了发票信息管理的模糊查询
增加了优惠券的批量激活 , 与批量短信整合发送
2025-05-06 16:00:24 +08:00
1215525055@qq.com
870c913b53 Merge remote-tracking branch 'origin/master' 2025-04-24 19:16:05 +08:00
1215525055@qq.com
b310c19590 修改了对公充值和系统充值的到账推送 2025-04-24 19:15:57 +08:00
TS-QD1
32082ae821 fix: 修改问题 2025-04-18 19:03:44 +08:00
32 changed files with 1121 additions and 100 deletions

View File

@ -57,7 +57,6 @@ public class CouponController extends DefaultBaseController {
return new SuccessResult();
}
@ApiOperation(value = "新增优惠券", notes = "新增优惠券接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PostMapping("save")
@ -67,6 +66,18 @@ public class CouponController extends DefaultBaseController {
return new SuccessResult();
}
@ApiOperation(value = "批量激活", notes = "批量激活接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@ApiImplicitParams({
@ApiImplicitParam(name = "couponId", value = "优惠券ID", paramType = "path")
})
@PutMapping("activi-all/{ids}")
@CheckRequestBodyAnnotation
public synchronized SuccessResult update(@PathVariable("ids") String ids) {
couponService.activiAll(Arrays.asList(ids.split("\\_")));
return new SuccessResult();
}
@ApiOperation(value = "修改优惠券", notes = "修改优惠券接口")
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@ApiImplicitParams({

View File

@ -1,5 +1,6 @@
package cn.com.tenlion.operator.controller.api.packageorder;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderWriteoffVO;
import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.interfaces.consts.ISystemConstant;
@ -54,6 +55,18 @@ public class PackageOrderController extends DefaultBaseController {
return new SuccessResult();
}
@ApiOperation(value = "修改套餐包-订单", notes = "修改套餐包-订单接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "packageOrderId", value = "套餐包-订单ID", paramType = "path")
})
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@PutMapping("update-writeoff/{packageOrderId}")
@CheckRequestBodyAnnotation
public SuccessResult updateWriteoff(@PathVariable("packageOrderId") String packageOrderId, @RequestBody PackageOrderWriteoffVO packageOrderWriteoffVO) {
packageOrderService.updateWriteoff(packageOrderId, packageOrderWriteoffVO);
return new SuccessResult();
}
@ApiOperation(value = "修改套餐包-订单", notes = "修改套餐包-订单接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "packageOrderId", value = "套餐包-订单ID", paramType = "path")

View File

@ -0,0 +1,64 @@
package cn.com.tenlion.operator.controller.api.user.info;
import io.swagger.annotations.ApiModelProperty;
/**
* 支付实体
* @author : LY
* @date :2024-1-30 10:16
* @description :
* @modyified By:
*/
public class PayVO {
@ApiModelProperty(name = "auditExplain", value = "用户ID")
private String userId;
@ApiModelProperty(name = "accountMoney", value = "金额")
private Integer accountMoney;
@ApiModelProperty(name = "description", value = "说明")
private String description;
@ApiModelProperty(name = "orderId", value = "订单ID")
private String orderId;
@ApiModelProperty(name = "code", value = "")
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getAccountMoney() {
return accountMoney;
}
public void setAccountMoney(Integer accountMoney) {
this.accountMoney = accountMoney;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
}

View File

@ -7,6 +7,7 @@ import cn.com.tenlion.operator.pojo.vos.useric.UserRechargeVO;
import cn.com.tenlion.operator.pojo.vos.useric.UsericVO;
import cn.com.tenlion.operator.service.user.info.IUserInfoService;
import cn.com.tenlion.operator.serviceother.operator.accountrecharge.IAccountRechargeService;
import cn.com.tenlion.operator.util.PayUtil;
import ink.wgink.annotation.CheckRequestBodyAnnotation;
import ink.wgink.common.base.DefaultBaseController;
import ink.wgink.interfaces.consts.ISystemConstant;
@ -47,6 +48,7 @@ public class UserInfoController extends DefaultBaseController {
@PutMapping("save-recharge/{userId}")
@CheckRequestBodyAnnotation
public SuccessResult saveRecharge(@PathVariable("userId") String userId, @RequestBody UserRechargeVO userRechargeVO) {
if(userRechargeVO.getThirdPartyMode().equals("充值")) {
/**
* 创建充值记录
*/
@ -60,6 +62,16 @@ public class UserInfoController extends DefaultBaseController {
rechargeVO.setRechargeRemark(userRechargeVO.getRechargeRemark());
rechargeVO.setRechargeMoney(userRechargeVO.getRechargeMoney());
iAccountRechargeService.saveSystem(rechargeVO);
}else {
/**
* 创建扣款记录
*/
AccountRechargeVO rechargeVO = new AccountRechargeVO();
rechargeVO.setAccountId(userId);
rechargeVO.setRechargeRemark(userRechargeVO.getRechargeRemark());
rechargeVO.setRechargeMoney(userRechargeVO.getRechargeMoney());
iAccountRechargeService.saveSystemReduce(rechargeVO);
}
return new SuccessResult();
}

View File

@ -212,10 +212,8 @@ public class ComplaintAppController extends DefaultBaseController {
Map<String, String> templateParams = new HashMap<>();
templateParams.put("code", code);
templateParams.put("time", EhCacheType.USER_VERIFICATION_CODE.getMinute() + "");
Boolean result = TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00001", templateParams, phoneArray);
if(!result) {
throw new UpdateException("发送短信失败");
}
TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00001", templateParams, phoneArray);
ehCacheService.remove(EhCacheType.USER_VERIFICATION_CODE, phone + "PhoneCode");
ehCacheService.put(EhCacheType.USER_VERIFICATION_CODE,phone + "PhoneCode", code);
return new SuccessResultData<>("success");

View File

@ -1,5 +1,6 @@
package cn.com.tenlion.operator.controller.route.user.info;
import cn.com.tenlion.projectconfig.util.ProjectConfigUtil;
import ink.wgink.interfaces.consts.ISystemConstant;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@ -35,10 +36,23 @@ public class UserInfoRouteController {
return modelAndView;
}
@GetMapping("recharge-pay")
public ModelAndView rechargePay() {
ModelAndView modelAndView = new ModelAndView("user/info/recharge-pay");
@GetMapping("package-list")
public ModelAndView packageList() {
ModelAndView modelAndView = new ModelAndView("user/info/package-list");
return modelAndView;
}
@GetMapping("recharge-pay")
public ModelAndView rechargePay() {
ModelAndView modelAndView = new ModelAndView("user/info/recharge-pay");
modelAndView.addObject("phone", ProjectConfigUtil.getText("HandleInvoicePhones"));
return modelAndView;
}
@GetMapping("package-writeoff")
public ModelAndView packageWriteof() {
ModelAndView modelAndView = new ModelAndView("user/info/package-writeoff");
modelAndView.addObject("phone", ProjectConfigUtil.getText("HandleInvoicePhones"));
return modelAndView;
}
}

View File

@ -0,0 +1,14 @@
package cn.com.tenlion.operator.pojo.dtos.coupon;
public class CouponSend {
public Integer count;
public Double money;
public CouponSend(Integer count, Double money) {
this.count = count;
this.money = money;
}
}

View File

@ -24,6 +24,8 @@ public class PackageOrderItemDTO {
private String accountItemId;
@ApiModelProperty(name = "mode", value = "方式1:次数+1,2:次数-1")
private Integer mode;
@ApiModelProperty(name = "itemUseCount", value = "本次使用")
private Integer itemUseCount;
@ApiModelProperty(name = "description", value = "流水描述")
private String description;
@ApiModelProperty(name = "orderId", value = "关联的平台订单ID")
@ -41,6 +43,14 @@ public class PackageOrderItemDTO {
@ApiModelProperty(name = "packageName", value = "套餐包名称")
private String packageName;
public Integer getItemUseCount() {
return itemUseCount == null ? 0 : itemUseCount;
}
public void setItemUseCount(Integer itemUseCount) {
this.itemUseCount = itemUseCount;
}
public String getPackageName() {
return packageName == null ? "" : packageName.trim();
}

View File

@ -0,0 +1,41 @@
package cn.com.tenlion.operator.pojo.vos.packageorder;
import ink.wgink.annotation.CheckEmptyAnnotation;
import ink.wgink.annotation.CheckNumberAnnotation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
*
* @ClassName: PackageOrderVO
* @Description: 套餐包-订单
* @Author: CodeFactory
* @Date: 2025-02-26 14:48:15
* @Version: 3.0
**/
@ApiModel
public class PackageOrderWriteoffVO {
@ApiModelProperty(name = "packageOutCount", value = "核销次数")
@CheckEmptyAnnotation(name = "核销次数")
private Integer packageOutCount;
@ApiModelProperty(name = "packageTotalMoney", value = "核销备注")
@CheckEmptyAnnotation(name = "核销备注")
private String packageOutRemark;
public Integer getPackageOutCount() {
return packageOutCount == null ? 0 : packageOutCount;
}
public void setPackageOutCount(Integer packageOutCount) {
this.packageOutCount = packageOutCount;
}
public String getPackageOutRemark() {
return packageOutRemark == null ? "" : packageOutRemark.trim();
}
public void setPackageOutRemark(String packageOutRemark) {
this.packageOutRemark = packageOutRemark;
}
}

View File

@ -34,6 +34,16 @@ public class PackageOrderItemAppVO {
@ApiModelProperty(name = "code", value = "加密内容")
@CheckEmptyAnnotation(name = "加密内容")
private String code;
@ApiModelProperty(name = "itemUseCount", value = "次数")
private Integer itemUseCount;
public Integer getItemUseCount() {
return itemUseCount == null ? 1 : itemUseCount;
}
public void setItemUseCount(Integer itemUseCount) {
this.itemUseCount = itemUseCount;
}
public String getUserId() {
return userId == null ? "" : userId.trim();

View File

@ -36,6 +36,15 @@ public class PackageOrderItemVO {
private String orderTitle;
@ApiModelProperty(name = "itemCount", value = "剩余次数")
private Integer itemCount;
@ApiModelProperty(name = "itemUseCount", value = "本次使用")
private Integer itemUseCount;
public Integer getItemUseCount() {
return itemUseCount == null ? 1 : itemUseCount;
}
public void setItemUseCount(Integer itemUseCount) {
this.itemUseCount = itemUseCount;
}
public Integer getItemCount() {
return itemCount == null ? 0 : itemCount;

View File

@ -19,7 +19,8 @@ public class UserRechargeVO {
@ApiModelProperty(name = "rechargeMoney", value = "金额")
@CheckNumberAnnotation(name = "金额")
private Double rechargeMoney;
@ApiModelProperty(name = "thirdPartyMode", value = "充值扣款")
private String thirdPartyMode;
@ApiModelProperty(name = "rechargeRemark", value = "备注")
private String rechargeRemark;
@ApiModelProperty(name = "userId", value = "用户")
@ -29,6 +30,14 @@ public class UserRechargeVO {
@ApiModelProperty(name = "code", value = "加密串")
private String code;
public String getThirdPartyMode() {
return thirdPartyMode == null ? "" : thirdPartyMode.trim();
}
public void setThirdPartyMode(String thirdPartyMode) {
this.thirdPartyMode = thirdPartyMode;
}
public String getRechargeRemark() {
return rechargeRemark == null ? "" : rechargeRemark.trim();
}

View File

@ -38,6 +38,16 @@ public interface IAccountItemRemoteService {
SuccessResult payOut(@RemoteServerParams String server,
@RemoteJsonBodyParams AccountItemOrderVO accountItemOrderVO,
@RemoteQueryParams("access_token") String accessToken);
/**
* 支出
* @param server
* @param accountItemOrderVO
* @param accessToken
* @return
*/
@RemotePostMethod("pay-in/ai")
SuccessResult payIn(@RemoteServerParams String server,
@RemoteJsonBodyParams AccountItemOrderVO accountItemOrderVO,
@RemoteQueryParams("access_token") String accessToken);
}

View File

@ -113,6 +113,7 @@ public interface IPackageInfoService {
* @return
*/
PackageInfoDTO get(String packageInfoId);
PackageInfoDTO getDTO(String packageInfoId);
/**
* 套餐包详情

View File

@ -176,6 +176,15 @@ public class PackageInfoServiceImpl extends DefaultBaseService implements IPacka
return dto;
}
@Override
public PackageInfoDTO getDTO(String packageInfoId) {
Map<String, Object> params = super.getHashMap(2);
params.put("packageInfoId", packageInfoId);
PackageInfoDTO dto = packageInfoDao.get(params);
return dto;
}
@Override
public PackageInfoDTO get(String packageInfoId) {
Map<String, Object> params = super.getHashMap(2);

View File

@ -1,6 +1,7 @@
package cn.com.tenlion.operator.service.packageorder;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderAppVO;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderWriteoffVO;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;
import cn.com.tenlion.operator.pojo.dtos.packageorder.PackageOrderDTO;
@ -202,4 +203,6 @@ public interface IPackageOrderService {
void updateClose(String packageNo);
Map<String, Integer> getCount(String userId);
void updateWriteoff(String packageOrderId, PackageOrderWriteoffVO packageOrderWriteoffVO);
}

View File

@ -10,10 +10,13 @@ import cn.com.tenlion.operator.pojo.dtos.user.info.UserInfoDTO;
import cn.com.tenlion.operator.pojo.vos.accountitem.AccountItemOrderVO;
import cn.com.tenlion.operator.pojo.vos.accountitem.AccountItemVO;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderAppVO;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderWriteoffVO;
import cn.com.tenlion.operator.pojo.vos.packageorderitem.PackageOrderItemAppVO;
import cn.com.tenlion.operator.properties.SystemApiPathProperties;
import cn.com.tenlion.operator.remote.accountitem.IAccountItemRemoteService;
import cn.com.tenlion.operator.remote.user.info.IUserInfoRemoteService;
import cn.com.tenlion.operator.service.packageinfo.IPackageInfoService;
import cn.com.tenlion.operator.service.packageorderitem.IPackageOrderItemService;
import cn.com.tenlion.operator.serviceother.operator.accountitem.IAccountItemService;
import cn.com.tenlion.operator.serviceother.operator.accountrecharge.IAccountRechargeService;
import cn.com.tenlion.operator.util.EncryptUtil;
@ -273,6 +276,9 @@ public class PackageOrderServiceImpl extends DefaultBaseService implements IPack
packageOrderDao.remove(params);
}
@Autowired
private IPackageOrderItemService packageOrderItemService;
@Override
public Map<String, Integer> getCount(String userId) {
Map<String, Integer> result = new HashMap<>();
@ -295,6 +301,24 @@ public class PackageOrderServiceImpl extends DefaultBaseService implements IPack
return result;
}
@Override
public void updateWriteoff(String packageOrderId, PackageOrderWriteoffVO packageOrderWriteoffVO) {
PackageOrderDTO packageOrderDTO = get(packageOrderId);
if(packageOrderWriteoffVO.getPackageOutCount() > packageOrderDTO.getPackageTotalSurplusCount()) {
throw new SaveException("核销次数超出了剩余次数");
}
PackageInfoDTO infoDTO = iPackageInfoService.get(packageOrderDTO.getPackageInfoId());
PackageOrderItemAppVO packageOrderItemAppVO = new PackageOrderItemAppVO();
packageOrderItemAppVO.setUserId(packageOrderDTO.getCreator());
packageOrderItemAppVO.setOrderId("SYS" + DateUtil.getSdfTimes() + ( (int) (Math.random() * (99999 - 10000 + 1)) + 10000 ));
packageOrderItemAppVO.setPackageOrderId(packageOrderId);
packageOrderItemAppVO.setOrderType(infoDTO.getPackageType());
packageOrderItemAppVO.setOrderTitle("系统核销");
packageOrderItemAppVO.setItemUseCount(packageOrderWriteoffVO.getPackageOutCount());
packageOrderItemAppVO.setDescription("系统核销 . " + packageOrderWriteoffVO.getPackageOutRemark());
packageOrderItemService.saveApp("minus", packageOrderItemAppVO);
}
@Override
public List<PackageOrderDTO> list(Map<String, Object> params) {
List<PackageOrderDTO> list = packageOrderDao.list(params);

View File

@ -191,7 +191,7 @@ public class PackageOrderItemServiceImpl extends DefaultBaseService implements I
* 增加子账号 2025年3月13日17:02:07
*/
UserExpandDTO userExpandDTO = userExpandService.get(packageOrderItemAppVO.getUserId());
if(!StringUtils.isEmpty(userExpandDTO.getMainUserId())) {
if (!StringUtils.isEmpty(userExpandDTO.getMainUserId())) {
msg = " / 子账号" + userExpandDTO.getUserUsername();
packageOrderItemAppVO.setUserId(userExpandDTO.getMainUserId());
}
@ -209,7 +209,7 @@ public class PackageOrderItemServiceImpl extends DefaultBaseService implements I
query.put("available", "查找剩余数量大于0的");
query.put("availableType", type);
List<PackageOrderDTO> list = iPackageOrderService.list(query);
if(list.size() > 0 ) {
if (list.size() > 0) {
packageOrderItemAppVO.setPackageOrderId(list.get(0).getPackageOrderId());
}
}
@ -218,11 +218,11 @@ public class PackageOrderItemServiceImpl extends DefaultBaseService implements I
throw new SaveException("无可用的套餐包");
}
if (!type.equals("plus")) {
if (orderDTO.getPackageTotalSurplusCount() < 1) {
if (orderDTO.getPackageTotalSurplusCount() < packageOrderItemAppVO.getItemUseCount()) {
throw new SaveException("该套餐包余额不足");
}
}else{
if (orderDTO.getPackageTotalCount() < orderDTO.getPackageTotalSurplusCount() + 1) {
} else {
if (orderDTO.getPackageTotalCount() < orderDTO.getPackageTotalSurplusCount() + packageOrderItemAppVO.getItemUseCount()) {
throw new SaveException("说你想干嘛?");
}
}
@ -233,8 +233,9 @@ public class PackageOrderItemServiceImpl extends DefaultBaseService implements I
itemVO.setOrderType(packageOrderItemAppVO.getOrderType());
itemVO.setPackageOrderAvgMoney(orderDTO.getPackageTotalAvgMoney());
itemVO.setMode(type.equals("plus") ? 1 : 2);
itemVO.setItemUseCount(packageOrderItemAppVO.getItemUseCount());
itemVO.setOrderTitle(packageOrderItemAppVO.getOrderTitle());
itemVO.setItemCount(type.equals("plus") ? orderDTO.getPackageTotalSurplusCount() + 1 : orderDTO.getPackageTotalSurplusCount() - 1);
itemVO.setItemCount(type.equals("plus") ? orderDTO.getPackageTotalSurplusCount() + packageOrderItemAppVO.getItemUseCount() : orderDTO.getPackageTotalSurplusCount() - packageOrderItemAppVO.getItemUseCount());
String packageOrderItemId = UUIDUtil.getUUID();
Map<String, Object> params = HashMapUtil.beanToMap(itemVO);
@ -250,9 +251,9 @@ public class PackageOrderItemServiceImpl extends DefaultBaseService implements I
packageOrderItemDao.save(params);
Map<String, Object> update = super.getHashMap(2);
update.put("packageOrderId", orderDTO.getPackageOrderId() );
update.put("packageOrderId", orderDTO.getPackageOrderId());
update.put("gmtModified", currentDate);
update.put("packageTotalSurplusCount", type.equals("plus") ? orderDTO.getPackageTotalSurplusCount() + 1 : orderDTO.getPackageTotalSurplusCount() - 1);
update.put("packageTotalSurplusCount", type.equals("plus") ? orderDTO.getPackageTotalSurplusCount() + packageOrderItemAppVO.getItemUseCount() : orderDTO.getPackageTotalSurplusCount() - packageOrderItemAppVO.getItemUseCount());
iPackageOrderService.updateCount(update);
}

View File

@ -4,6 +4,7 @@ import cn.com.tenlion.operator.daoother.copyright1.coupon.ICouponDao;
import cn.com.tenlion.operator.enums.coupon.CouponStatusEnum;
import cn.com.tenlion.operator.enums.coupon.CouponTypeEnum;
import cn.com.tenlion.operator.pojo.dtos.coupon.CouponDTO;
import cn.com.tenlion.operator.pojo.dtos.coupon.CouponSend;
import cn.com.tenlion.operator.pojo.dtos.coupon.CouponSimpleDTO;
import cn.com.tenlion.operator.pojo.dtos.coupon.related.user.CouponRelatedUserDTO;
import cn.com.tenlion.operator.pojo.dtos.coupon.related.user.RelatedUserDTO;
@ -35,10 +36,7 @@ import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -58,6 +56,77 @@ public class CouponService extends DefaultBaseService {
@Autowired
private CouponUserService couponUserService;
public void activiAll(List<String> ids) {
Map<String, List<CouponDTO>> params = new LinkedHashMap<>();
// 手机号 ,
for(String id : ids) {
CouponDTO dto = get(id);
if (dto.getStatus().getText().equals(CouponStatusEnum.ACTIVE.getText())) {
throw new SaveException(dto.getTitle() + "</br>已激活");
}
if (dto.getType().getText().equals(CouponTypeEnum.QUOTA.getText())) {
throw new SaveException(dto.getTitle() + "</br>非定额定向");
}
List<CouponRelatedUserDTO> list1 = dto.getRelatedUsers();
if (list1.size() < 1) {
throw new SaveException(dto.getTitle() + "</br>未指定用户群");
}
List<String> temp = new ArrayList<>();
for(CouponRelatedUserDTO dto1 : list1) {
temp.add(dto1.getUserUsername());
}
temp.add(dto.getUseGmtStart());
temp.add(dto.getAmount() + "");
temp.add(dto.getUseGmtEnd());
Collections.sort(temp);
List<CouponDTO> data = params.get(temp.toString());
if(data == null) {
data = new ArrayList<>();
}
data.add(dto);
params.put(temp.toString(), data);
}
for(Map.Entry<String, List<CouponDTO>> m : params.entrySet()) {
List<CouponDTO> list = m.getValue();
Integer count = list.size();
List<CouponRelatedUserDTO> tempList = list.get(0).getRelatedUsers();
/**
* 1. 保存领取记录 / 更新领取数量
*/
for(CouponDTO dd : list) {
for (CouponRelatedUserDTO userDTO : dd.getRelatedUsers()) {
CouponUserVO vo = new CouponUserVO();
vo.setCouponId(dd.getCouponId());
couponUserService.save(vo, userDTO.getUserId());
}
Map<String, Object> dataParans = getHashMap(4);
dataParans.put("couponId", dd.getCouponId());
dataParans.put("status", CouponStatusEnum.ACTIVE.name());
setUpdateInfo(dataParans);
couponDao.updateStatus(dataParans);
}
/**
* 2. 向用户群发送短信
*/
JSONArray phoneArray = new JSONArray();
for (CouponRelatedUserDTO userDTO : tempList) {
JSONObject obj = new JSONObject();
obj.put("phone", userDTO.getUserUsername());
phoneArray.add(obj);
}
Map<String, String> templateParams = new HashMap<>();
templateParams.put("money", PayUtil.buiderMoney(list.get(0).getAmount()) + "");
templateParams.put("count", count + "");
LocalDate startDate = LocalDate.parse(list.get(0).getUseGmtStart(), originalFormatter);
LocalDate endDate = LocalDate.parse(list.get(0).getUseGmtEnd(), originalFormatter);
templateParams.put("startTime", startDate.format(targetFormatter));
templateParams.put("endTime", endDate.format(targetFormatter));
TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00018", templateParams, phoneArray);
}
}
public void save(CouponVO couponVO) {
if (couponVO.getReleaseQuantity() < 1) {
throw new SaveException("发布数量不合法");
@ -180,10 +249,7 @@ public class CouponService extends DefaultBaseService {
LocalDate endDate = LocalDate.parse(couponDTO.getUseGmtEnd(), originalFormatter);
templateParams.put("startTime", startDate.format(targetFormatter));
templateParams.put("endTime", endDate.format(targetFormatter));
Boolean result = TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00006", templateParams, phoneArray);
if(!result) {
throw new UpdateException("向用户群发送短信失败");
}
TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00006", templateParams, phoneArray);
}
}
Map<String, Object> params = getHashMap(4);
@ -337,4 +403,5 @@ public class CouponService extends DefaultBaseService {
}
couponRelatedUserService.saveBatch(couponId1, couponRelatedUserVOS);
}
}

View File

@ -31,7 +31,9 @@ public interface IAccountRechargeService {
*/
void save(AccountRechargeVO accountRechargeVO);
String saveSystem(AccountRechargeVO accountRechargeVO);
void saveSystemReduce(AccountRechargeVO accountRechargeVO);
void saveSystem(AccountRechargeVO accountRechargeVO);
/**
* 新增账户充值

View File

@ -1,5 +1,6 @@
package cn.com.tenlion.operator.serviceother.operator.accountrecharge.impl;
import cn.com.tenlion.operator.controller.api.user.info.PayVO;
import cn.com.tenlion.operator.daoother.operator.IAccountRechargeDao;
import cn.com.tenlion.operator.daoother.operator.userinfo.IUserInfoDao;
import cn.com.tenlion.operator.enums.RechargeCheckEnum;
@ -16,10 +17,12 @@ import cn.com.tenlion.operator.pojo.dtos.packageinfo.PackageInfoDTO;
import cn.com.tenlion.operator.pojo.dtos.packageorder.PackageOrderDTO;
import cn.com.tenlion.operator.pojo.dtos.user.info.UserInfoDTO;
import cn.com.tenlion.operator.pojo.pos.accountrecharge.AccountRechargePO;
import cn.com.tenlion.operator.pojo.vos.accountitem.AccountItemOrderVO;
import cn.com.tenlion.operator.pojo.vos.accountitem.AccountItemVO;
import cn.com.tenlion.operator.pojo.vos.accountrecharge.AccountRechargeVO;
import cn.com.tenlion.operator.pojo.vos.packageorder.PackageOrderAppVO;
import cn.com.tenlion.operator.properties.SystemApiPathProperties;
import cn.com.tenlion.operator.remote.accountitem.IAccountItemRemoteService;
import cn.com.tenlion.operator.service.packageinfo.IPackageInfoService;
import cn.com.tenlion.operator.service.packageorder.IPackageOrderService;
import cn.com.tenlion.operator.serviceother.operator.account.IAccountService;
@ -27,6 +30,7 @@ import cn.com.tenlion.operator.serviceother.operator.accountitem.IAccountItemSer
import cn.com.tenlion.operator.serviceother.operator.accountrecharge.IAccountRechargeService;
import cn.com.tenlion.operator.service.user.info.IUserInfoService;
import cn.com.tenlion.operator.service.sys.callback.SysCallbackService;
import cn.com.tenlion.operator.util.EncryptUtil;
import cn.com.tenlion.operator.util.PayUtil;
import cn.com.tenlion.operator.util.TenlionSMS;
import cn.com.tenlion.operator.util.UserUtil;
@ -39,6 +43,7 @@ import ink.wgink.exceptions.ParamsException;
import ink.wgink.exceptions.SaveException;
import ink.wgink.exceptions.SearchException;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.module.oauth2.manager.OAuth2ClientTokenManager;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.user.UserDTO;
import ink.wgink.pojo.result.SuccessResultList;
@ -84,6 +89,8 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
private SysCallbackService sysCallbackService;
@Autowired
private IAccountItemService iAccountItemService;
@Autowired
private IAccountItemRemoteService iAccountItemRemoteService;
@Override
public SuccessResultList<List<AccountRechargeInvoiceDTO>> getCanIsSueInvoices(String userId, ListPage page) {
@ -117,39 +124,81 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
}
@Override
public String saveSystem(AccountRechargeVO accountRechargeVO) {
accountRechargeVO.setReconciliationStatus("0");
public void saveSystemReduce(AccountRechargeVO accountRechargeVO) {
// 生成流水记录
AccountItemOrderVO accountItemOrderVO = new AccountItemOrderVO();
accountItemOrderVO.setOrderId("SYS" + DateUtil.getSdfTimes() + ( (int) (Math.random() * (99999 - 10000 + 1)) + 10000 ));
accountItemOrderVO.setUserId(accountRechargeVO.getAccountId()); // 代理商userId
accountItemOrderVO.setAccountMoney(PayUtil.buiderMoney(accountRechargeVO.getRechargeMoney()));
accountItemOrderVO.setDescription("系统扣款" + (StringUtils.isEmpty(accountRechargeVO.getRechargeRemark()) ? "" : " * " + accountRechargeVO.getRechargeRemark() ) );
JSONObject jsonObject = new JSONObject();
jsonObject.put("time", DateUtil.getTime());
jsonObject.put("money" ,PayUtil.buiderMoney(accountRechargeVO.getRechargeMoney()));
jsonObject.put("userId", accountRechargeVO.getAccountId());
jsonObject.put("orderId", accountItemOrderVO.getOrderId());
accountItemOrderVO.setCode(EncryptUtil.encode(jsonObject.toJSONString()));
accountItemOrderVO.setType(4);
iAccountItemRemoteService.payOut(apiPathProperties.getUserCenter(), accountItemOrderVO, getAccessToken());
}
@Override
public void saveSystem(AccountRechargeVO accountRechargeVO) {
accountRechargeVO.setReconciliationStatus("1");
accountRechargeVO.setRechargeCheck("2");
String accountRechargeId = getUUID("sys");
Map<String, Object> params = HashMapUtil.beanToMap(accountRechargeVO);
params.put("accountRechargeId", accountRechargeId);
params.put("reconciliationTime", DateUtil.getTime());
setSaveInfo(params);
accountRechargeDao.save(params);
AccountRechargeDTO dto = get(accountRechargeId);
if (StringUtils.isEmpty(dto.getAccountItemId()) && dto.getReconciliationStatus().equals(ReconciliationStatusEnum.UN_RECONCILIATION.getValue())) {
// 1. 生成流水记录
AccountItemVO vo = new AccountItemVO();
/* AccountItemVO vo = new AccountItemVO();
vo.setType(1);
vo.setMode(1);
vo.setAccountId(dto.getAccountId());
vo.setAccountMoney(PayUtil.buiderMoney(dto.getRechargeMoney()));
vo.setDescription("系统充值" + (StringUtils.isEmpty(accountRechargeVO.getRechargeRemark()) ? "" : " * " + accountRechargeVO.getRechargeRemark() ) );
String accountItemId = iAccountItemService.saveReturnId(vo);
iAccountItemService.saveReturnId(vo);*/
// 生成流水记录
AccountItemOrderVO accountItemOrderVO = new AccountItemOrderVO();
accountItemOrderVO.setOrderId("SYS" + DateUtil.getSdfTimes() + ( (int) (Math.random() * (99999 - 10000 + 1)) + 10000 ));
accountItemOrderVO.setUserId(accountRechargeVO.getAccountId()); // 代理商userId
accountItemOrderVO.setType(1);
accountItemOrderVO.setAccountMoney(PayUtil.buiderMoney(accountRechargeVO.getRechargeMoney()));
accountItemOrderVO.setDescription("系统充值" + (StringUtils.isEmpty(accountRechargeVO.getRechargeRemark()) ? "" : " * " + accountRechargeVO.getRechargeRemark() ) );
JSONObject jsonObject = new JSONObject();
jsonObject.put("time", DateUtil.getTime());
jsonObject.put("money" ,PayUtil.buiderMoney(accountRechargeVO.getRechargeMoney()));
jsonObject.put("userId", accountRechargeVO.getAccountId());
jsonObject.put("orderId", accountItemOrderVO.getOrderId());
accountItemOrderVO.setCode(EncryptUtil.encode(jsonObject.toJSONString()));
iAccountItemRemoteService.payIn(apiPathProperties.getUserCenter(), accountItemOrderVO, getAccessToken());
try{
// 3. 调用第三方接口, 告知充值到账
JSONObject jsonobject =new JSONObject();
jsonobject.put("money", dto.getRechargeMoney());
sysCallbackService.save("系统充值到账", systemApiPathProperties.getCopyright() + "api/pay/recharge-success/user-id/" + accountItemId, jsonobject);
// 更新到账状态
Map<String, Object> params1 = getHashMap(2);
params1.put("accountRechargeIds", "1");
params1.put("reconciliationTime", DateUtil.getTime());
params1.put("accountRechargeId", accountRechargeId);
accountRechargeDao.update(params1);
jsonobject.put("money", accountRechargeVO.getRechargeMoney());
sysCallbackService.save("系统充值到账", systemApiPathProperties.getCopyright() + "api/pay/recharge-success/user-id/" + accountRechargeVO.getAccountId(), jsonobject);
}catch(Exception e) {
e.printStackTrace();
}
}
return accountRechargeId;
/**
* 获取accesstoken
* @return
*/
private String getAccessToken(){
String accessToken = OAuth2ClientTokenManager.getInstance().getToken().getAccessToken();
if(StringUtils.isBlank(accessToken)){
throw new SearchException("获取accesstoken失败");
}
return accessToken;
}
@Override
@ -274,6 +323,9 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
}
params.put("rechargeRemark", rechargeRemark);
accountRechargeDao.updateRemark(params);
AccountRechargeDTO dto = accountRechargeDao.get(params);
if (StringUtils.isEmpty(po.getAccountItemId()) && po.getReconciliationStatus().equals("0")) {
// 1. 生成流水记录
AccountItemVO vo = new AccountItemVO();
@ -285,21 +337,21 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
String accountItemId = iAccountItemService.saveReturnId(vo);
// 2. 修改状态为2
updateCheck(po.getAccountRechargeId(), RechargeCheckEnum.RECHARGE_SUCCESS, rechargeRemark, accountItemId, "", DateUtil.getTime());
// 套餐包购买的不通知
if(StringUtils.isEmpty(dto.getPackageInfoId())) {
// 3. 平台通知到账
JSONObject jsonobject =new JSONObject();
jsonobject.put("money", po.getRechargeMoney());
sysCallbackService.save("对公充值到账", systemApiPathProperties.getCopyright() + "api/pay/recharge-success/user-id/" + po.getAccountId(), jsonobject);
jsonobject.put("money", dto.getRechargeMoney());
sysCallbackService.save("对公充值到账", systemApiPathProperties.getCopyright() + "api/pay/recharge-success/user-id/" + dto.getAccountId(), jsonobject);
}
// 4. 短信通知到账
/**
* TODO-CBC : 金额 大于 10 , 短信通知客户已到账
*/
Map<String, Object> query = new HashMap<>();
query.put("userId", po.getAccountId());
UserInfoDTO userInfoDTO = iUserInfoDao.get(query);
UserDTO userDTO = iUserBaseService.get( po.getAccountId() );
JSONArray phoneArray = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("phone", userInfoDTO.getUserUsername());
obj.put("phone", userDTO.getUserUsername());
phoneArray.add(obj);
LocalDate startDate = LocalDate.parse(po.getGmtCreate(), originalFormatter);
@ -503,7 +555,7 @@ public class AccountRechargeServiceImpl extends DefaultBaseService implements IA
AccountRechargeDTO dto = get(accountRechargeId);
// 绑定了套餐包 & 已对账 & 已到账
if(!StringUtils.isEmpty(dto.getPackageInfoId()) && dto.getReconciliationStatus().equals("1") && dto.getRechargeCheck().equals("2")) {
PackageInfoDTO packageInfoDTO = iPackageInfoService.get(dto.getPackageInfoId());
PackageInfoDTO packageInfoDTO = iPackageInfoService.getDTO(dto.getPackageInfoId());
PackageOrderDTO orderDTO = iPackageOrderService.getByPackageNo(accountRechargeId);
// 远程更改套餐包的付款到账状态
String accountItemId1 = UUIDUtil.getUUID();

View File

@ -157,10 +157,7 @@ public class ComplaintServiceImpl extends DefaultBaseService implements IComplai
Map<String, String> templateParams = new HashMap<>();
templateParams.put("title", handleContent.length() > 30 ? handleContent.substring(0 , 30) + "..." : handleContent);
templateParams.put("date", date);
Boolean result = TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00004", templateParams, phoneArray);
if(!result) {
throw new UpdateException("向用户发送短信失败");
}
TenlionSMS.sendMessage(UUIDUtil.getUUID(), "M00004", templateParams, phoneArray);
}
}

View File

@ -1,7 +1,7 @@
server:
port: 8099
url: http://192.168.0.15:8099/operator-plugin
ip: 192.168.0.15
url: http://121.36.71.250:58038/operator-plugin
ip: 121.36.71.250
system-title: 运营平台(扩展)
system-sub-title: 运营平台(扩展)
# default-home-page: route/land/page
@ -115,7 +115,7 @@ spring:
mongodb:
uri: mongodb://smartcity:smartcity@10.25.248.193:6011/smartcity
redis:
database: 6
database: 1
host: 192.168.0.156
port: 6379
password: 666
@ -217,7 +217,7 @@ file:
security:
oauth2:
oauth-server: http://192.168.0.15:8091/operator/
oauth-server: http://121.36.71.250:58038/operator/
oauth-logout: ${security.oauth2.oauth-server}/logout?redirect_uri=${server.url}
client:
client-id: 0cf040b3344f471f882fb751c15493ff
@ -236,7 +236,7 @@ security:
api-path:
user-center: http://192.168.0.15:8091/operator/
copyright: http://192.168.0.15:7025/copyright/
copyright-external: http://192.168.0.15:7025/copyright/
copyright-external: http://121.36.71.250:58038/copyright/
operator-plugin: http://192.168.0.15:8099/operator-plugin/
# 短信验证码服务

View File

@ -242,7 +242,13 @@
<if test="keywords != null and keywords != ''">
AND (
<!-- 这里添加其他条件 -->
t1.id LIKE CONCAT('%', #{keywords}, '%')
t1.invoice_name LIKE CONCAT('%', #{keywords}, '%')
OR
t1.invoice_number LIKE CONCAT('%', #{keywords}, '%')
OR
t1.invoice_banknumber LIKE CONCAT('%', #{keywords}, '%')
OR
t1.invoice_orgaddress LIKE CONCAT('%', #{keywords}, '%')
)
</if>
<if test="startTime != null and startTime != ''">

View File

@ -12,6 +12,7 @@
<result column="order_id" property="orderId"/>
<result column="package_name" property="packageName"/>
<result column="item_count" property="itemCount"/>
<result column="item_use_count" property="itemUseCount"/>
<result column="order_type" property="orderType"/>
<result column="order_title" property="orderTitle"/>
<result column="creator" property="creator"/>
@ -56,6 +57,7 @@
mode,
description,
item_count,
item_use_count,
order_id,
order_type,
order_title,
@ -69,6 +71,7 @@
#{mode},
#{description},
#{itemCount},
#{itemUseCount},
#{orderId},
#{orderType},
#{orderTitle},
@ -134,7 +137,8 @@
t1.order_id,
t1.order_type,
t1.order_title,
t1.package_order_item_id
t1.package_order_item_id,
t1.item_use_count
FROM
operator_package_order_item t1
WHERE
@ -208,7 +212,8 @@
t1.order_title,
t1.creator,
t1.gmt_create,
t3.package_name
t3.package_name,
t1.item_use_count
FROM
operator_package_order_item t1
LEFT JOIN

View File

@ -68,9 +68,9 @@
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm" lay-event="removeEvent">
<i class="fa fa-lg fa-trash"></i> 删除
</button>
<!-- <button type="button" class="layui-btn layui-btn-danger layui-btn-sm" lay-event="activiEvent">
<i class="fa fa-lg fa-globe"></i> 激活优惠券
</button>-->
<button type="button" class="layui-btn layui-btn-sm" lay-event="activiEvent">
<i class="fa fa-lg fa-globe"></i> 定额定向批量激活
</button>
</div>
</script>
</div>
@ -362,6 +362,39 @@
}
removeData(ids);
}
} else if(layEvent === 'activiEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += '_';
}
ids += item['couponId'];
if( item['type'] != 'QUOTA_USERS') {
layer.msg("* 仅支持定额定向的优惠券");
return;
}
if( item['status'] != 'UN_ACTIVE') {
layer.msg("* 仅支持未激活的优惠券");
return;
}
}
top.dialog.confirm("确定要批量激活这些优惠券吗?</br> * 激活后会向用户群发送短信通知", function(index) {
top.dialog.close(index);
var loadLayerIndex;
top.restAjax.put(`api/coupon/activi-all/${ids}`, {}, null, function(code, data) {
reloadTable();
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
});
}
}
});

View File

@ -53,7 +53,7 @@
<textarea name="recharge" readonly style="max-height:40px;" id="recharge" placeholder="" class="layui-textarea"></textarea>
</div>
</div>
<blockquote class="layui-elem-quote">发票信息</blockquote>
<blockquote class="layui-elem-quote" id="copyTextClick" data-clipboard-action="copy" title="点此复制开票信息到剪切板" style="cursor:pointer">发票信息</blockquote>
<div class="layui-row ">
<div class="layui-col-md4">
<div class="layui-form-item">
@ -228,9 +228,11 @@
</div>
</div>
</div>
<button id="copyText" style="opacity:0;"/>
<script src="assets/js/vendor/wangEditor/wangEditor.min.js"></script>
<script src="assets/js/vendor/ckplayer/ckplayer/ckplayer.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/js/vendor/safety/copy/clipboard.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
layui.config({
@ -248,6 +250,34 @@
var wangEditorObj = {};
var viewerObj = {};
$("#copyTextClick").click(function (data) {
var clipboard = new Clipboard('#copyText', {
text: function(trigger) {
var textData = "公司名称 : " + $("#invoiceName").val();
textData = textData + "\r\n" + "公司税号 : " + $("#invoiceNumber").val();
textData = textData + "\r\n" + "发票类型 : " + $('input[name="invoiceClassify"]:checked').val();
textData = textData + "\r\n" + "公司地址 : " + $("#invoiceOrgaddress").val();
textData = textData + "\r\n" + "联系电话 : " + $("#invoiceOrgtel").val();
textData = textData + "\r\n" + "开票内容 : " + $('input[name="invoicePurpose"]:checked').val();
textData = textData + "\r\n" + "开户银行 : " + $("#invoiceBank").val();
textData = textData + "\r\n" + "开户行账号 : " + $("#invoiceBanknumber").val();
textData = textData + "\r\n" + "开票税率 : " + $('input[name="invoiceTaxrate"]:checked').val();
textData = textData + "\r\n" + "发票金额 : " + $("#invoiceRechargeMoney").val() + "元";
return textData;
}
});
clipboard.on('success', function(e) {
layer.msg("开票信息已复制到剪切板")
e.clearSelection();
});
clipboard.on('error', function(e) {
layer.msg("开票信息复制失败");
});
$("#copyText").click();
});
function initInvoicePurposeSelect(value) {
top.restAjax.get(top.restAjax.path('[[${CopyrightUrl}]]app/data/listbyparentidrelease/e0251d55-cd52-4f57-be92-b2bef8a6dd62', []), {}, null, function(code, data, args) {
laytpl(document.getElementById('invoicePurposeSelectTemplate').innerHTML).render(data, function(html) {

View File

@ -87,16 +87,17 @@
[
{type:'checkbox', fixed: 'left'},
{field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'mode', width: 100, title: '类型', align:'center', fixed: 'left',
{field: 'mode', width: 120, title: '类型', align:'center', fixed: 'left',
templet: function(row) {
var rowData = row[this.field];
var itemUseCount = row["itemUseCount"];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
if(rowData == 1) {
return '<span class="layui-badge layui-bg-green">退回 + 1</span>';
return '<span class="layui-badge layui-bg-green">退回 + ' + itemUseCount + ' </span>';
}else if(rowData == 2) {
return '<span class="layui-badge">使用 - 1</span>';
return '<span class="layui-badge">使用 - ' + itemUseCount + '</span>';
}
return rowData;
}

View File

@ -104,7 +104,10 @@
<i class="fa fa-lg fa-globe "></i> 充值记录
</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="rechargeEvent">
<i class="fa fa-lg fa-shopping-bag "></i> 系统充值
<i class="fa fa-lg fa-paypal "></i> 充值与扣款
</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="packageEvent">
<i class="fa fa-lg fa-shopping-bag "></i> 用户套餐包
</button>
</div>
</script>
@ -434,7 +437,7 @@
} else {
top.layer.open({
type: 2,
title: "用户 <b>" + checkDatas[0].userName + "</b> <b style='color: rgba(255, 127, 80, 0.75)'>" + checkDatas[0].userInfoName+ "</b> 系统充值【<b style='color: rgba(255, 27, 20, 0.75)'>当前余额 " + (checkDatas[0].accountMoney / 100.0) + ' 元</b>】',
title: "用户 <b>" + checkDatas[0].userName + "</b> <b style='color: rgba(255, 127, 80, 0.75)'>" + checkDatas[0].userInfoName+ "</b> 系统充值与扣款<b style='color: rgba(255, 27, 20, 0.75)'>当前余额 " + (checkDatas[0].accountMoney / 100.0) + ' 元</b>】',
closeBtn: 1,
area: ['50%', '50%'],
shadeClose: true,
@ -445,6 +448,25 @@
}
});
}
}else if(layEvent === 'packageEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectEdit);
} else if(checkDatas.length > 1) {
top.dialog.msg(top.dataMessage.table.selectOneEdit);
} else {
top.layer.open({
type: 2,
title: "用户 <b>" + checkDatas[0].userName + "</b> <b style='color: rgba(255, 127, 80, 0.75)'>" + checkDatas[0].userInfoName+ "</b> 套餐包【<b style='color: rgba(255, 27, 20, 0.75)'>当前余额 " + (checkDatas[0].accountMoney / 100.0) + ' 元</b>】',
closeBtn: 1,
area: ['80%', '80%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/user/info/package-list?accountId={accountId}', [checkDatas[0].userId]),
end: function() {
reloadTable();
}
});
}
}else if(layEvent === 'rechargeRecordEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectEdit);

View File

@ -0,0 +1,317 @@
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'}">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
</head>
<body>
<div class="layui-fluid layui-anim layui-anim-fadein">
<div class="layui-row">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="test-table-reload-btn" style="margin-bottom: 10px;">
<div class="layui-inline">
<input type="text" id="keywords" class="layui-input search-item" placeholder="输入关键字">
</div>
<div class="layui-inline">
<input type="text" id="startTime" class="layui-input search-item" placeholder="开始时间" readonly>
</div>
<div class="layui-inline">
<input type="text" id="endTime" class="layui-input search-item" placeholder="结束时间" readonly>
</div>
<div class="layui-inline layui-form search-item" >
<select id="keYong" name="keYong">
<option value="">全部</option>
<option value="keYong" selected>未用完的</option>
</select>
</div>
<!-- <div class="layui-inline layui-form search-item" >
<select id="packagePayStatus" name="packagePayStatus">
<option value="">付款状态</option>
<option value="1">已付款</option>
<option value="0">未付款</option>
</select>
</div>-->
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
</div>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<!-- 表头按钮组 -->
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm" lay-event="saveEvent">
<i class="fa fa-lg fa-recycle"></i> 使用记录
</button>
<button type="button" class="layui-btn layui-btn-sm" lay-event="writeOffEvent">
<i class="fa fa-lg fa-paypal"></i> 套餐包核销
</button>
</div>
</script>
</div>
</div>
</div>
</div>
</div>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'table', 'laydate', 'common'], function() {
var $ = layui.$;
var $win = $(window);
var table = layui.table;
var admin = layui.admin;
var laydate = layui.laydate;
var common = layui.common;
var resizeTimeout = null;
var accountId = top.restAjax.params(window.location.href).accountId;
var tableUrl = 'api/packageorder/listpage?userId=' + accountId;
// 初始化表格
function initTable() {
table.render({
elem: '#dataTable',
id: 'dataTable',
url: top.restAjax.path(tableUrl, []),
width: admin.screen() > 1 ? '100%' : '',
height: $win.height() - 90,
defaultToolbar:[],
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
toolbar: '#headerToolBar',
request: {
pageName: 'page',
limitName: 'rows'
},
where: {
keYong: 'keYong'
},
cols: [
[
{type:'checkbox', fixed: 'left'},
{field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'packageName', width: 210, title: '套餐名称', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'packageOrderId', width: 210, title: '订单号', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'userName', width: 320, title: '购买人', align:'center',
templet: function(row) {
var rowData = row[this.field];
var userType = row["userType"];
var creator = row["creator"];
var userUsername = row["userUsername"];
if(creator == '1') {
return '<b>系统管理员</b>';
}
return '<img style="height:21px;width:21px" src="assets/images/plugin/' + userType + '.png"/><span>' + (rowData + '【' + userUsername + '】' ) + '</span>';
}
},
{field: 'packageTotalMoney', width: 120, title: '订单金额', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return (rowData / 100) + "元";
}
},
{field: 'packageTotalSurplusCount', width: 150, title: '总件/剩余件', align:'center',
templet: function(row) {
var packageTotalCount = row["packageTotalCount"];
var rowData = row[this.field];
return packageTotalCount + " / " + (rowData == 0 ? '<font style="color: red">0</font>' : rowData);
}
},
{field: 'gmtCreate', width: 180, title: '购买时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'packagePayStatus', width: 120, title: '付款状态', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '' || rowData == '0') {
return '-';
}
if(rowData == '1') {
return '<b style="color:green">已付款</b>';
}
}
},
{field: 'packagePay', width: 180, title: '付款时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
]
],
page: true,
parseData: function(data) {
return {
'code': 0,
'msg': '',
'count': data.total,
'data': data.rows
};
}
});
}
// 重载表格
function reloadTable(currentPage) {
table.reload('dataTable', {
url: top.restAjax.path(tableUrl, []),
where: {
keywords: $('#keywords').val(),
startTime: $('#startTime').val(),
endTime: $('#endTime').val(),
userInfoType: $('#userInfoType').val(),
packagePayStatus: $('#packagePayStatus').val(),
keYong: $('#keYong').val()
},
page: {
curr: currentPage
},
height: $win.height() - 90,
});
}
// 初始化日期
function initDate() {
// 日期选择
laydate.render({
elem: '#startTime',
format: 'yyyy-MM-dd'
});
laydate.render({
elem: '#endTime',
format: 'yyyy-MM-dd'
});
}
// 删除
function removeData(ids) {
top.dialog.msg(top.dataMessage.delete, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/packageorder/remove/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
reloadTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
initTable();
initDate();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
reloadTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
reloadTable(1);
});
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'saveEvent') {
top.layer.open({
type: 2,
title: "用户 <b>" + checkDatas[0].userUsername + "</b> <b style='color: rgba(255, 127, 80, 0.75)'>" + checkDatas[0].userName+ "</b> 订单 " + checkDatas[0].packageOrderId + " 的使用流水",
closeBtn: 1,
area: ['90%', '90%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/packageorderitem/list?packageOrderId={packageOrderId}', [checkDatas[0].packageOrderId]),
end: function() {
reloadTable();
}
});
} else if(layEvent === 'writeOffEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectEdit);
} else if(checkDatas.length > 1) {
top.dialog.msg(top.dataMessage.table.selectOneEdit);
} else {
if(checkDatas[0].packageTotalSurplusCount < 1) {
layer.msg("选择的套餐包已用完");
reloadTable();
return;
}
top.layer.open({
type: 2,
title: "用户 <b>" + checkDatas[0].userUsername + "</b> <b style='color: rgba(255, 127, 80, 0.75)'>" + checkDatas[0].userName+ "</b> 订单 " + checkDatas[0].packageOrderId + " 套餐包核销",
closeBtn: 1,
area: ['50%', '50%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/user/info/package-writeoff?packageOrderId={packageOrderId}', [checkDatas[0].packageOrderId]),
end: function() {
reloadTable();
}
});
}
} else if(layEvent === 'removeEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += '_';
}
ids += item['packageOrderId'];
}
removeData(ids);
}
}
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,221 @@
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'}">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
</head>
<body>
<div class="layui-fluid layui-anim layui-anim-fadein">
<div class="layui-card">
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-form-item layui-row" >
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">交易流水号</label>
<div class="layui-input-block">
<input type="text" id="packageNo" name="packageNo" readonly class="layui-input" value="" placeholder="请输入交易流水号" maxlength="50">
</div>
</div>
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">付款时间</label>
<div class="layui-input-block">
<input type="text" id="packagePay" readonly name="packagePay" class="layui-input" value="" placeholder="请输入订单付款时间" maxlength="50">
</div>
</div>
</div>
<div class="layui-form-item layui-row" >
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">订单总金额</label>
<div class="layui-input-block">
<input type="number" id="packageTotalMoney" readonly name="packageTotalMoney" class="layui-input" value="" placeholder="请输入套餐订单总金额/单位分" lay-verify="required">
</div>
</div>
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">订单总次数</label>
<div class="layui-input-block">
<input type="number" id="packageTotalCount" readonly name="packageTotalCount" class="layui-input" value="" placeholder="请输入套餐订单总次数/单位分" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item layui-row" >
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">单次均价</label>
<div class="layui-input-block">
<input type="number" id="packageTotalAvgMoney" readonly name="packageTotalAvgMoney" class="layui-input" value="" placeholder="请输入套餐订单单次均价/单位分" lay-verify="required">
</div>
</div>
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">剩余次数</label>
<div class="layui-input-block">
<input type="number" id="packageTotalSurplusCount" readonly name="packageTotalSurplusCount" class="layui-input" value="" placeholder="请输入当前剩余次数" lay-verify="required">
</div>
</div>
</div>
<div class="layui-form-item layui-row" >
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">核销次数<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="text" id="packageOutCount" name="packageOutCount" class="layui-input" value="" placeholder="请输入本次需要核销的次数" maxlength="50">
</div>
</div>
<div class="layui-col-xs6 layui-col-md6 layui-col-lg6" >
<label class="layui-form-label">核销备注<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="text" id="packageOutRemark" name="packageOutRemark" class="layui-input" value="" placeholder="请输入核销备注" maxlength="50">
</div>
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交核销</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="assets/js/vendor/wangEditor/wangEditor.min.js"></script>
<script src="assets/js/vendor/ckplayer/ckplayer/ckplayer.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/' //静态资源所在路径
}).extend({
index: 'lib/index' //主入口模块
}).use(['index', 'form', 'laydate', 'laytpl'], function(){
var $ = layui.$;
var form = layui.form;
var laytpl = layui.laytpl;
var laydate = layui.laydate;
var packageOrderId = top.restAjax.params(window.location.href).packageOrderId;
var wangEditor = window.wangEditor;
var wangEditorObj = {};
var viewerObj = {};
function closeBox() {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
function refreshDownloadTemplet(fileName, file) {
var dataRander = {};
dataRander[fileName] = file;
laytpl(document.getElementById(fileName +'FileDownload').innerHTML).render(dataRander, function(html) {
document.getElementById(fileName +'FileBox').innerHTML = html;
});
}
// 初始化文件列表
function initFileList(fileName, ids, callback) {
var dataForm = {};
dataForm[fileName] = ids;
form.val('dataForm', dataForm);
if(!ids) {
refreshDownloadTemplet(fileName, []);
if(callback) {
callback(fileName, []);
}
return;
}
top.restAjax.get(top.restAjax.path('api/file/list', []), {
ids: ids
}, null, function(code, data) {
refreshDownloadTemplet(fileName, data);
if(callback) {
callback(fileName, data);
}
}, function(code, data) {
top.dialog.msg(data.msg);
});
}
// 初始化视频
function initVideo(fileName, data) {
for(var i = 0, item; item = data[i++];) {
var player = new ckplayer({
container: '#'+ fileName + i,
variable: 'player',
flashplayer: false,
video: {
file: 'route/file/download/true/'+ item.fileId,
type: 'video/mp4'
}
});
}
}
// 初始化内容
function initData() {
var loadLayerIndex;
top.restAjax.get(top.restAjax.path('api/packageorder/get/{packageOrderId}', [packageOrderId]), {}, null, function(code, data) {
var dataFormData = {};
for(var i in data) {
dataFormData[i] = data[i] +'';
}
form.val('dataForm', dataFormData);
form.render(null, 'dataForm');
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
}
initData();
// 提交表单
form.on('submit(submitForm)', function(formData) {
top.dialog.confirm("该操作提交后无法回退, 确认核销?", function(index) {
top.dialog.close(index);
var loadLayerIndex;
top.restAjax.put(top.restAjax.path('api/packageorder/update-writeoff/{packageOrderId}', [packageOrderId]), formData.field, null, function(code, data) {
var layerIndex = top.dialog.msg("核销成功", {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function(index) {
top.dialog.close(index);
window.location.reload();
},
btn2: function() {
closeBox();
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
});
return false;
});
$('.close').on('click', function() {
closeBox();
});
// 校验
form.verify({
});
});
</script>
</body>
</html>

View File

@ -35,14 +35,14 @@
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<input type="hidden" id="accountRechargeId" name="accountRechargeId" value=""/>
<div class="layui-form-item">
<label class="layui-form-label">充值金额<span style="color: red">*</span></label>
<label class="layui-form-label">操作金额<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="number" id="rechargeMoney" value="" step="0.1" max="2000" name="rechargeMoney" class="layui-input" placeholder="请输入充值的金额" lay-verify="required" style="width: 70%;float: left" maxlength="36">
<input type="number" id="rechargeMoney" value="" step="0.1" max="2000" name="rechargeMoney" class="layui-input" placeholder="请输入操作的金额" lay-verify="required" style="width: 70%;float: left" maxlength="36">
<button type="button" class="layui-btn" style="width: 30%" ></button>
</div>
</div>
<div class="layui-form-item" pane="">
<label class="layui-form-label">付款方式<span style="color: red">*</span></label>
<label class="layui-form-label">交易方式<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="radio" name="thirdParty" lay-skin="primary" disabled lay-verify="required" value="微信" lay-filter="thirdParty" title="微信">
<input type="radio" name="thirdParty" value="支付宝" disabled lay-filter="thirdParty" title="支付宝">
@ -50,16 +50,23 @@
<input type="radio" name="thirdParty" value="对公转账" disabled lay-filter="thirdParty" title="对公转账">
</div>
</div>
<div class="layui-form-item" pane="">
<label class="layui-form-label">充值扣款<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="radio" name="thirdPartyMode" value="充值" lay-verify="required" title="充值">
<input type="radio" name="thirdPartyMode" value="扣款" lay-verify="required" title="扣款">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备注内容<span style="color: red">*</span></label>
<div class="layui-input-block">
<input type="text" id="rechargeRemark" name="rechargeRemark" class="layui-input" placeholder="请输入备注内容" >
<input type="text" id="rechargeRemark" name="rechargeRemark" lay-verify="required" class="layui-input" placeholder="请输入备注内容" >
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="layui-footer" style="left: 0;">
<button type="button" class="layui-btn" id="submit" lay-submit lay-filter="submitForm">确认充值</button>
<button type="button" class="layui-btn" id="submit" lay-submit lay-filter="submitForm">确认操作</button>
<button type="button" class="layui-btn layui-btn-primary close">关闭窗口</button>
</div>
</div>
@ -104,13 +111,21 @@
// 提交表单
form.on('submit(submitForm)', function(formData) {
top.dialog.confirm("提交后会充值到用户账号中,且无法回退。", function(index) {
top.dialog.confirm("提交后会直接操作用户账号,且无法回退。", function(index) {
$('#submit').attr("disabled", "disabled");
$('#submit').addClass("layui-btn-disabled");
top.dialog.close(index);
/*
layer.prompt({title: '已发送验证码 至 [[${phone}]]', formType: 3 , value: "" , placeholder : "请输入验证码" }, function(title, index1){
if(title) {
}
});
*/
var loadLayerIndex;
top.restAjax.put(top.restAjax.path('api/user/info/save-recharge/{accountId}', [accountId]), formData.field, null, function(code, data) {
layer.alert("充值成功");
layer.alert("操作成功");
closeBox();
}, function(code, data) {
top.dialog.msg(data.msg);