Compare commits

...

5 Commits

Author SHA1 Message Date
DB
a9dd3986b7 添加积分修改金额表单 2024-05-30 18:37:09 +08:00
DB
e1cfa8e6bb 添加拼团分账订单 2024-05-27 10:39:51 +08:00
DB
b3346765e4 添加拼团分账订单 2024-04-24 18:53:09 +08:00
DB
94c94dd1be 拼团秒杀活动 2024-04-19 10:08:57 +08:00
DB
9cd4f4e1f8 分会申请分页 2024-04-18 15:34:15 +08:00
39 changed files with 1375 additions and 191 deletions

View File

@ -14,7 +14,7 @@ public enum OrderSource {
MALL("Mall",0.002),
/**
* 一次性支付
* 放心学
*/
EASY_LEARN("EasyLearn",0.002),

View File

@ -26,7 +26,7 @@ public class CpopGenerator {
* 数据库 URL
*/
// private static final String URL = "jdbc:mysql://localhost:3306/cpop-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
private static final String URL = "jdbc:mysql://localhost:3306/cpop_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
private static final String URL = "jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
/**
* 数据库用户名
*/
@ -34,23 +34,23 @@ public class CpopGenerator {
/**
* 数据库密码
*/
private static final String PASSWORD = "Admin@123";
private static final String PASSWORD = "Customer0401";
//private static final String PASSWORD = "Customer0401";
/**
* 输出路径
*/
private static final String EXPORT_URL = "/Cpop-Jambox";
private static final String EXPORT_URL = "/Cpop-Mall";
/**
* 模块
*/
private static final String EXPORT_ITEM = "jambox";
private static final String EXPORT_ITEM = "mall";
/**
* 表前缀
*/
private static final String TABLE_PREFIX = "cp_j_";
private static final String TABLE_PREFIX = "cp_mall_";
/**
* 主入口

View File

@ -65,7 +65,7 @@ public class EasyLearnUnionPayBo {
* 订单类型
*/
@NotBlank(message = "联合支付类型不能为空")
@ApiModelProperty(value = "联合支付类型(WX_PAY:微信支付;PREPAYMENT:预付;REPAYMENT:还款;MEMBER:会员)",required = true)
@ApiModelProperty(value = "联合支付类型(WX_PAY:微信支付;PREPAYMENT:预付;REPAYMENT:还款;MEMBER:会员;GROUP_BOOKING:拼团)",required = true)
private String easyLearnUnionPay;
/**

View File

@ -116,6 +116,4 @@ public class WebsiteController {
return websiteService.getDevelopmentCourse();
}
}

View File

@ -46,6 +46,11 @@ public class EasyLearnOrderDetail extends BaseEntity implements Serializable {
*/
private String outOrderNo;
/**
* 外部订单号
*/
private String transactionId;
/**
* 期号
*/

View File

@ -615,7 +615,7 @@ public class EasyLearnOrderServiceImpl extends ServiceImpl<EasyLearnOrderMapper,
.setBody("联合支付")
.setOutTradeNo(easyLearnOrder.getId())
//元转分
.setTotalFee(easyLearnOrder.getTotalAmount().scaleByPowerOfTen(2).intValue())
.setTotalFee(StringUtils.equals(SpringUtils.getActiveProfile(), "prod") ? easyLearnOrder.getTotalAmount().scaleByPowerOfTen(2).intValue() : 1)
.setTradeType("JSAPI");
return wxPayService.createOrder(orderRequest);
}
@ -667,7 +667,8 @@ public class EasyLearnOrderServiceImpl extends ServiceImpl<EasyLearnOrderMapper,
//需要分账
String subMchId = wxPayHandler.getSubMchId(easyLearnOrder.getBrandId(), easyLearnOrder.getStoreId());
config.setSubMchId(subMchId);
wxPayAsyncTask.asyncWxPayProfitSharing(orderId, notifyResult, wxPayService, OrderSource.EASY_LEARN, easyLearnOrder.getRate());
wxPayAsyncTask.asyncWxPayProfitSharing(orderId, notifyResult, wxPayService,
easyLearnOrder.getOrderType().equals(EasyLearnPayPayEnum.GROUP_BOOKING.getOrderType()) ? OrderSource.MALL : OrderSource.EASY_LEARN, easyLearnOrder.getRate());
}
JSONObject jsonObject = new JSONObject();
EasyLearnPayPayEnum easyLearnPayPayEnum = EasyLearnPayPayEnum.getEasyLearnPayPayEnum(easyLearnOrder.getOrderType());

View File

@ -43,7 +43,13 @@ public enum EasyLearnPayPayEnum {
/**
* 会员
*/
MEMBER("MEMBER",7);
MEMBER("MEMBER",7),
/**
* 拼团
*/
GROUP_BOOKING("GROUP_BOOKING",8);
EasyLearnPayPayEnum(String name, Integer orderType) {
this.orderType = orderType;

View File

@ -56,9 +56,9 @@ mybatis-flex:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
datasource:
mall:
url: jdbc:mysql://localhost:3306/cpop_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Admin@123
password: Customer0401
jambox:
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/jambox_test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
username: root

View File

@ -56,14 +56,14 @@ public class CpopWxPayTests {
amount.setRefund(refund)
.setTotal(refund)
.setCurrency("CNY");
request.setTransactionId("4200002123202402194880609914")
request.setTransactionId("4200002176202404245283534577")
//.setOutTradeNo("1000000000202401121937112562856")
//.setTransactionId(order.getOutOrderNo())
//.setOutTradeNo(order.getId())
.setNotifyUrl(wxPayProperties.getNotifyRefund())
.setOutRefundNo(IdUtil.getSnowflakeNextIdStr())
.setSubMchid("1618925571")
.setReason("先学后付测试退款")
.setSubMchid("1670749045")
.setReason("拼团测试退款")
.setAmount(amount);
WxPayRefundV3Result result = wxPayService.refundV3(request);
System.out.println(result);
@ -136,8 +136,8 @@ public class CpopWxPayTests {
@Test
public void getOrderInfo() throws WxPayException {
WxPayConfig config = wxPayService.getConfig();
config.setSubMchId("1661323640");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002096202401188599394121", null);
config.setSubMchId("1670749045");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002205202404240308986697", null);
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
}
@ -175,10 +175,10 @@ public class CpopWxPayTests {
@Test
public void profitSharingFinish() throws WxPayException {
ProfitSharingUnfreezeRequest profitSharingFinishRequest = new ProfitSharingUnfreezeRequest();
profitSharingFinishRequest.setTransactionId("4200002122202401129346519359");
profitSharingFinishRequest.setOutOrderNo("1745820005743910912");
profitSharingFinishRequest.setTransactionId("4200002205202404240308986697");
profitSharingFinishRequest.setOutOrderNo("140678614679425024");
profitSharingFinishRequest.setDescription("结束分账");
profitSharingFinishRequest.setSubMchId("1661323640");
profitSharingFinishRequest.setSubMchId("1670749045");
wxPayService.getProfitSharingService().profitSharingFinish(profitSharingFinishRequest);
}

View File

@ -0,0 +1,106 @@
package com.cpop.mall.business.controller.backstage;
import com.cpop.core.base.R;
import com.cpop.mall.business.entity.Activity;
import com.cpop.mall.business.service.ActivityService;
import com.cpop.mall.business.vo.ActivityPageVo;
import com.mybatisflex.core.paginate.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.Serializable;
import java.util.List;
/**
* 商城活动 控制层
*
* @author DB
* @since 2024-04-18
*/
@RestController
@Api(tags = "商城活动接口")
@RequestMapping("/backstage/activity")
public class BackstageActivityController {
@Autowired
private ActivityService activityService;
/**
* 分页查询商城活动
* @param brandId 品牌id
* @param isUp 是否上架
* @return 分页对象
*/
@GetMapping("/getActivityPage")
@ApiOperation("分页查询商城活动")
public R<Page<ActivityPageVo>> getActivityPage(@RequestParam(required = false) @ApiParam("品牌id") String brandId,
@RequestParam(required = false) @ApiParam("品牌id") Boolean isUp) {
Page<ActivityPageVo> page = activityService.getActivityPage(brandId, isUp);
return R.ok(page);
}
/**
* 添加商城活动
*
* @param activity 商城活动
* @return {@code true} 添加成功{@code false} 添加失败
*/
@PostMapping("/save")
@ApiOperation("保存商城活动")
public boolean save(@RequestBody @ApiParam("商城活动") Activity activity) {
return activityService.save(activity);
}
/**
* 根据主键删除商城活动
*
* @param id 主键
* @return {@code true} 删除成功{@code false} 删除失败
*/
@DeleteMapping("/remove/{id}")
@ApiOperation("根据主键商城活动")
public boolean remove(@PathVariable @ApiParam("商城活动主键") Serializable id) {
return activityService.removeById(id);
}
/**
* 根据主键更新商城活动
*
* @param activity 商城活动
* @return {@code true} 更新成功{@code false} 更新失败
*/
@PutMapping("/update")
@ApiOperation("根据主键更新商城活动")
public boolean update(@RequestBody @ApiParam("商城活动主键") Activity activity) {
return activityService.updateById(activity);
}
/**
* 查询所有商城活动
*
* @return 所有数据
*/
@GetMapping("/list")
@ApiOperation("查询所有商城活动")
public List<Activity> list() {
return activityService.list();
}
/**
* 根据商城活动主键获取详细信息
*
* @param id 商城活动主键
* @return 商城活动详情
*/
@GetMapping("/getInfo/{id}")
@ApiOperation("根据主键获取商城活动")
public Activity getInfo(@PathVariable @ApiParam("商城活动主键") Serializable id) {
return activityService.getById(id);
}
}

View File

@ -0,0 +1,106 @@
package com.cpop.mall.business.controller.mini;
import com.mybatisflex.core.paginate.Page;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import com.cpop.mall.business.entity.Activity;
import com.cpop.mall.business.service.ActivityService;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.io.Serializable;
import java.util.List;
/**
* 商城活动 控制层
*
* @author DB
* @since 2024-04-18
*/
@RestController
@Api(tags = "商城活动接口")
@RequestMapping("/mini/activity")
public class MiniActivityController {
@Autowired
private ActivityService activityService;
/**
* 添加商城活动
*
* @param activity 商城活动
* @return {@code true} 添加成功{@code false} 添加失败
*/
@PostMapping("/save")
@ApiOperation("保存商城活动")
public boolean save(@RequestBody @ApiParam("商城活动") Activity activity) {
return activityService.save(activity);
}
/**
* 根据主键删除商城活动
*
* @param id 主键
* @return {@code true} 删除成功{@code false} 删除失败
*/
@DeleteMapping("/remove/{id}")
@ApiOperation("根据主键商城活动")
public boolean remove(@PathVariable @ApiParam("商城活动主键") Serializable id) {
return activityService.removeById(id);
}
/**
* 根据主键更新商城活动
*
* @param activity 商城活动
* @return {@code true} 更新成功{@code false} 更新失败
*/
@PutMapping("/update")
@ApiOperation("根据主键更新商城活动")
public boolean update(@RequestBody @ApiParam("商城活动主键") Activity activity) {
return activityService.updateById(activity);
}
/**
* 查询所有商城活动
*
* @return 所有数据
*/
@GetMapping("/list")
@ApiOperation("查询所有商城活动")
public List<Activity> list() {
return activityService.list();
}
/**
* 根据商城活动主键获取详细信息
*
* @param id 商城活动主键
* @return 商城活动详情
*/
@GetMapping("/getInfo/{id}")
@ApiOperation("根据主键获取商城活动")
public Activity getInfo(@PathVariable @ApiParam("商城活动主键") Serializable id) {
return activityService.getById(id);
}
/**
* 分页查询商城活动
*
* @param page 分页对象
* @return 分页对象
*/
@GetMapping("/page")
@ApiOperation("分页查询商城活动")
public Page<Activity> page(@ApiParam("分页信息") Page<Activity> page) {
return activityService.page(page);
}
}

View File

@ -0,0 +1,134 @@
package com.cpop.mall.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 商城活动 实体类
*
* @author DB
* @since 2024-04-18
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Table(value = "cp_mall_activity", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class Activity extends BaseEntity implements Serializable {
/**
* 主键
*/
@Id
private String id;
/**
* 品牌id
*/
private String brandId;
/**
* 活动类型 1拼团2秒杀
*/
private Integer activityType;
/**
* 活动名称
*/
private String activityName;
/**
* 颜色
*/
private String color;
/**
* 活动头图
*/
private String headPic;
/**
* 描述
*/
private String description;
/**
* 活动详情图
*/
private String detailPic;
/**
* 关联商品
*/
private String productList;
/**
* 拼团人数
*/
private Integer groupNum;
/**
* 单买价格
*/
private BigDecimal singlePrice;
/**
* 拼团价格
*/
private BigDecimal groupPrice;
/**
* 是否上架
*/
private Boolean isUp;
/**
* 是否置顶
*/
private Boolean isTop;
/**
* 秒杀开始时间
*/
private LocalDateTime secKillStartTime;
/**
* 秒杀结束时间
*/
private LocalDateTime secKillEndTime;
/**
* 活动开始时间
*/
private LocalDateTime activityStartTime;
/**
* 活动结束时间
*/
private LocalDateTime activityEndTime;
/**
* 备注
*/
private String remark;
/**
* 是否删除(0否1是)
*/
@Column(isLogicDelete = true)
private Boolean isDelete;
}

View File

@ -0,0 +1,51 @@
package com.cpop.mall.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 商城活动组 实体类
*
* @author DB
* @since 2024-04-18
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Table(value = "cp_mall_activity_group", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class ActivityGroup extends BaseEntity implements Serializable {
/**
* 活动组id
*/
@Id
private String id;
/**
* 活动组名
*/
private String activityGroupName;
/**
* 活动id
*/
private String activityId;
/**
* 商品id
*/
private String productId;
}

View File

@ -0,0 +1,42 @@
package com.cpop.mall.business.entity;
import com.cpop.core.base.entity.BaseEntity;
import com.cpop.core.base.entity.BaseInsertListener;
import com.cpop.core.base.entity.BaseUpdateListener;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
/**
* 拼团活动-校区 实体类
*
* @author DB
* @since 2024-04-19
*/
@Data
@EqualsAndHashCode(callSuper=false)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Table(value = "cp_mall_activity_store", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
public class ActivityStore extends BaseEntity implements Serializable {
/**
* 活动id
*/
@Id
private String activityId;
/**
* 校区id
*/
@Id
private String storeId;
}

View File

@ -0,0 +1,14 @@
package com.cpop.mall.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.mall.business.entity.ActivityGroup;
/**
* 商城活动组 映射层
*
* @author DB
* @since 2024-04-18
*/
public interface ActivityGroupMapper extends BaseMapper<ActivityGroup> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.mall.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.mall.business.entity.Activity;
/**
* 商城活动 映射层
*
* @author DB
* @since 2024-04-18
*/
public interface ActivityMapper extends BaseMapper<Activity> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.mall.business.mapper;
import com.mybatisflex.core.BaseMapper;
import com.cpop.mall.business.entity.ActivityStore;
/**
* 拼团活动-校区 映射层
*
* @author DB
* @since 2024-04-19
*/
public interface ActivityStoreMapper extends BaseMapper<ActivityStore> {
}

View File

@ -0,0 +1,14 @@
package com.cpop.mall.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.mall.business.entity.ActivityGroup;
/**
* 商城活动组 服务层
*
* @author DB
* @since 2024-04-18
*/
public interface ActivityGroupService extends IService<ActivityGroup> {
}

View File

@ -0,0 +1,25 @@
package com.cpop.mall.business.service;
import com.cpop.mall.business.vo.ActivityPageVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import com.cpop.mall.business.entity.Activity;
/**
* 商城活动 服务层
*
* @author DB
* @since 2024-04-18
*/
public interface ActivityService extends IService<Activity> {
/**
* 分页查询商城活动
* @author DB
* @since 2024/4/18
* @param brandId 品牌id
* @param isUp 是否上架
* @return Page<ActivityPageVo>
*/
Page<ActivityPageVo> getActivityPage(String brandId, Boolean isUp);
}

View File

@ -0,0 +1,14 @@
package com.cpop.mall.business.service;
import com.mybatisflex.core.service.IService;
import com.cpop.mall.business.entity.ActivityStore;
/**
* 拼团活动-校区 服务层
*
* @author DB
* @since 2024-04-19
*/
public interface ActivityStoreService extends IService<ActivityStore> {
}

View File

@ -0,0 +1,18 @@
package com.cpop.mall.business.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.mall.business.entity.ActivityGroup;
import com.cpop.mall.business.mapper.ActivityGroupMapper;
import com.cpop.mall.business.service.ActivityGroupService;
import org.springframework.stereotype.Service;
/**
* 商城活动组 服务层实现
*
* @author DB
* @since 2024-04-18
*/
@Service("activityGroupService")
public class ActivityGroupServiceImpl extends ServiceImpl<ActivityGroupMapper, ActivityGroup> implements ActivityGroupService {
}

View File

@ -0,0 +1,57 @@
package com.cpop.mall.business.service.impl;
import com.cpop.core.base.entity.PageDomain;
import com.cpop.core.utils.sql.SqlUtils;
import com.cpop.mall.business.vo.ActivityPageVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.mall.business.entity.Activity;
import com.cpop.mall.business.mapper.ActivityMapper;
import com.cpop.mall.business.service.ActivityService;
import org.springframework.stereotype.Service;
import java.util.List;
import static com.cpop.mall.business.entity.table.ActivityTableDef.ACTIVITY;
/**
* 商城活动 服务层实现
*
* @author DB
* @since 2024-04-18
*/
@Service("activityService")
public class ActivityServiceImpl extends ServiceImpl<ActivityMapper, Activity> implements ActivityService {
/**
* 分页查询商城活动
* @author DB
* @since 2024/4/18
* @param brandId 品牌id
* @param isUp 分页对象
* @return Page<ActivityPageVo>
*/
@Override
public Page<ActivityPageVo> getActivityPage(String brandId, Boolean isUp) {
/*LambdaQueryWrapper<ActivityInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(brandId != null, ActivityInfo::getBrandId, brandId);
queryWrapper.eq(ActivityInfo::getShelve, shelve);
queryWrapper.eq(ActivityInfo::getDeleted, "1");
queryWrapper.orderByDesc(ActivityInfo::getStick).orderByDesc(ActivityInfo::getLastModificationDate);
IPage activityInfoPage = this.page(pageinfo, queryWrapper);
List<ActivityInfo> activityInfos= activityInfoPage.getRecords();
for (ActivityInfo activityInfo : activityInfos) {
List<ActivityStore> activityStores=activityStoreMapper.selectStoreName(activityInfo.getActivityId());
activityInfo.setStoreList(activityStores);
}*/
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
return this.pageAs(Page.of(pageDomain.getPageNum(),pageDomain.getPageSize()), QueryWrapper.create()
.where(ACTIVITY.BRAND_ID.eq(brandId))
.and(ACTIVITY.IS_UP.eq(isUp))
.orderBy(ACTIVITY.IS_TOP.desc(), ACTIVITY.UPDATE_TIME.desc())
, ActivityPageVo.class);
}
}

View File

@ -0,0 +1,18 @@
package com.cpop.mall.business.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cpop.mall.business.entity.ActivityStore;
import com.cpop.mall.business.mapper.ActivityStoreMapper;
import com.cpop.mall.business.service.ActivityStoreService;
import org.springframework.stereotype.Service;
/**
* 拼团活动-校区 服务层实现
*
* @author DB
* @since 2024-04-19
*/
@Service("activityStoreService")
public class ActivityStoreServiceImpl extends ServiceImpl<ActivityStoreMapper, ActivityStore> implements ActivityStoreService {
}

View File

@ -0,0 +1,152 @@
package com.cpop.mall.business.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author DB
* @version 1.0.0
* @since 2024-04-18 18:02
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "拼团活动分页", description = "拼团活动分页")
public class ActivityPageVo {
/**
* 主键
*/
@ApiModelProperty(value = "主键")
private String id;
/**
* 活动类型 1拼团2秒杀
*/
@ApiModelProperty(value = "活动类型 1拼团2秒杀")
private Integer activityType;
/**
* 交易数量
*/
@ApiModelProperty(value = "交易数量")
private Integer tradeNum;
/**
* 交易金额
*/
@ApiModelProperty(value = "交易金额")
private BigDecimal tradeAmount;
/**
* 商品id
*/
@ApiModelProperty(value = "商品id")
private String productId;
/**
* 关联商品
*/
@ApiModelProperty(value = "关联商品")
private String productName;
/**
* 品牌id
*/
@ApiModelProperty(value = "品牌id")
private String brandId;
/**
* 品牌名
*/
@ApiModelProperty(value = "品牌名")
private String brandName;
/**
* 活动名称
*/
@ApiModelProperty(value = "活动名称")
private String activityName;
/**
* 颜色
*/
@ApiModelProperty(value = "颜色")
private String color;
/**
* 活动头图
*/
@ApiModelProperty(value = "活动头图")
private String headPic;
/**
* 描述
*/
@ApiModelProperty(value = "描述")
private String description;
/**
* 活动详情图
*/
@ApiModelProperty(value = "活动详情图")
private String detailPic;
/**
* 拼团人数
*/
@ApiModelProperty(value = "拼团人数")
private Integer groupNum;
/**
* 单买价格
*/
@ApiModelProperty(value = "单买价格")
private BigDecimal singlePrice;
/**
* 拼团价格
*/
@ApiModelProperty(value = "拼团价格")
private BigDecimal groupPrice;
/**
* 是否上架
*/
@ApiModelProperty(value = "是否上架")
private Boolean isUp;
/**
* 是否置顶
*/
@ApiModelProperty(value = "是否置顶")
private Boolean isTop;
/**
* 秒杀开始时间
*/
@ApiModelProperty(value = "秒杀开始时间")
private LocalDateTime secKillStartTime;
/**
* 秒杀结束时间
*/
@ApiModelProperty(value = "秒杀结束时间")
private LocalDateTime secKillEndTime;
/**
* 活动开始时间
*/
@ApiModelProperty(value = "活动开始时间")
private LocalDateTime activityStartTime;
/**
* 活动结束时间
*/
@ApiModelProperty(value = "活动结束时间")
private LocalDateTime activityEndTime;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cpop.mall.business.mapper.ActivityGroupMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cpop.mall.business.mapper.ActivityMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cpop.mall.business.mapper.ActivityStoreMapper">
</mapper>

View File

@ -1,61 +0,0 @@
[2024-01-22 15:21:23.553] INFO [background-preinit] Version.java:21 - HV000001: Hibernate Validator 6.2.5.Final
[2024-01-22 15:21:23.563] INFO [main] StartupInfoLogger.java:55 - Starting CpopDataSyncTests using Java 1.8.0_231 on DESKTOP-PIJFD5O with PID 22368 (started by Lost in E:\Cpop\Cpop-Union\Cpop-Oam\Cpop-Oam-Web)
[2024-01-22 15:21:23.564] INFO [main] SpringApplication.java:637 - The following 3 profiles are active: "prod", "core", "pay"
[2024-01-22 15:21:24.940] INFO [main] RepositoryConfigurationDelegate.java:262 - Multiple Spring Data modules found, entering strict repository configuration mode
[2024-01-22 15:21:24.945] INFO [main] RepositoryConfigurationDelegate.java:132 - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
[2024-01-22 15:21:24.967] INFO [main] RepositoryConfigurationDelegate.java:201 - Finished Spring Data repository scanning in 6 ms. Found 0 Redis repository interfaces.
[2024-01-22 15:21:25.206] INFO [main] LogAccessor.java:292 - No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
[2024-01-22 15:21:25.221] INFO [main] LogAccessor.java:292 - No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
[2024-01-22 15:21:25.688] INFO [main] PostProcessorRegistrationDelegate.java:376 - Bean 'com.mybatisflex.spring.boot.FlexTransactionAutoConfiguration' of type [com.mybatisflex.spring.boot.FlexTransactionAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2024-01-22 15:21:25.997] INFO [main] PostProcessorRegistrationDelegate.java:376 - Bean 'mybatis-flex-com.mybatisflex.spring.boot.MybatisFlexProperties' of type [com.mybatisflex.spring.boot.MybatisFlexProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2024-01-22 15:21:26.008] INFO [main] PostProcessorRegistrationDelegate.java:376 - Bean 'com.mybatisflex.spring.boot.MultiDataSourceAutoConfiguration' of type [com.mybatisflex.spring.boot.MultiDataSourceAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2024-01-22 15:21:26.135] INFO [main] PostProcessorRegistrationDelegate.java:376 - Bean 'redisConfig' of type [com.cpop.core.config.RedisConfig$$EnhancerBySpringCGLIB$$979fa58a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[2024-01-22 15:21:27.184] INFO [main] TomcatWebServer.java:108 - Tomcat initialized with port(s): 0 (http)
[2024-01-22 15:21:27.194] INFO [main] DirectJDKLog.java:173 - Initializing ProtocolHandler ["http-nio-auto-1"]
[2024-01-22 15:21:27.197] INFO [main] DirectJDKLog.java:173 - Starting service [Tomcat]
[2024-01-22 15:21:27.197] INFO [main] DirectJDKLog.java:173 - Starting Servlet engine: [Apache Tomcat/9.0.79]
[2024-01-22 15:21:27.417] INFO [main] DirectJDKLog.java:173 - Initializing Spring embedded WebApplicationContext
[2024-01-22 15:21:27.417] INFO [main] ServletWebServerApplicationContext.java:292 - Root WebApplicationContext: initialization completed in 3825 ms
[2024-01-22 15:21:28.467] INFO [main] HikariDataSource.java:110 - HikariPool-1 - Starting...
[2024-01-22 15:21:29.147] INFO [main] HikariDataSource.java:123 - HikariPool-1 - Start completed.
[2024-01-22 15:21:32.104] INFO [main] StdSchedulerFactory.java:1220 - Using default implementation for ThreadExecutor
[2024-01-22 15:21:32.106] INFO [main] SimpleThreadPool.java:268 - Job execution threads will use class loader of thread: main
[2024-01-22 15:21:32.118] INFO [main] SchedulerSignalerImpl.java:61 - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[2024-01-22 15:21:32.119] INFO [main] QuartzScheduler.java:229 - Quartz Scheduler v.2.3.2 created.
[2024-01-22 15:21:32.122] INFO [main] JobStoreSupport.java:672 - Using db table-based data access locking (synchronization).
[2024-01-22 15:21:32.124] INFO [main] JobStoreCMT.java:145 - JobStoreCMT initialized.
[2024-01-22 15:21:32.125] INFO [main] QuartzScheduler.java:294 - Scheduler meta-data: Quartz Scheduler (v2.3.2) 'CpopOamScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 1 threads.
Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered.
[2024-01-22 15:21:32.125] INFO [main] StdSchedulerFactory.java:1374 - Quartz scheduler 'CpopOamScheduler' initialized from an externally provided properties instance.
[2024-01-22 15:21:32.126] INFO [main] StdSchedulerFactory.java:1378 - Quartz scheduler version: 2.3.2
[2024-01-22 15:21:32.126] INFO [main] QuartzScheduler.java:2293 - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@1d5048d1
[2024-01-22 15:21:32.798] INFO [main] InitConfig.java:41 - ===========================项目启动角色初始化===========================
[2024-01-22 15:21:34.212] INFO [main] DefaultSecurityFilterChain.java:55 - Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@4c3d72fd, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@259c6ab8, org.springframework.security.web.context.SecurityContextPersistenceFilter@39420d59, org.springframework.security.web.header.HeaderWriterFilter@3340ff7c, com.cpop.core.filter.JwtAuthenticationFilter@1488a861, org.springframework.security.web.authentication.logout.LogoutFilter@5bf1b528, com.cpop.core.filter.RepeatableFilter@22e813fc, com.cpop.core.gateway.sys.SysAuthenticationFilter@605eb072, com.cpop.core.gateway.miniProgram.MiniProgramAuthenticationFilter@1fa9692b, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5dd227b7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@14ba7f15, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@640a6d4b, org.springframework.security.web.session.SessionManagementFilter@5e198c40, org.springframework.security.web.access.ExceptionTranslationFilter@6cbb6c41, org.springframework.security.web.access.intercept.AuthorizationFilter@7ef7f414]
[2024-01-22 15:21:35.868] INFO [main] LogAccessor.java:174 - Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
[2024-01-22 15:21:35.868] INFO [main] LogAccessor.java:174 - Channel 'Cpop-Oam-Prod.errorChannel' has 1 subscriber(s).
[2024-01-22 15:21:35.868] INFO [main] LogAccessor.java:292 - started bean '_org.springframework.integration.errorLogger'
[2024-01-22 15:21:35.869] INFO [main] DirectJDKLog.java:173 - Starting ProtocolHandler ["http-nio-auto-1"]
[2024-01-22 15:21:35.893] INFO [main] TomcatWebServer.java:220 - Tomcat started on port(s): 59855 (http) with context path '/Cpop-Oam'
[2024-01-22 15:21:35.895] INFO [main] SchedulerFactoryBean.java:734 - Will start Quartz Scheduler [CpopOamScheduler] in 1 seconds
[2024-01-22 15:21:35.912] INFO [main] StartupInfoLogger.java:61 - Started CpopDataSyncTests in 12.809 seconds (JVM running for 14.317)
[2024-01-22 15:21:36.907] INFO [Quartz Scheduler [CpopOamScheduler]] SchedulerFactoryBean.java:750 - Starting Quartz Scheduler now, after delay of 1 seconds
[2024-01-22 15:21:37.083] INFO [Quartz Scheduler [CpopOamScheduler]] JobStoreSupport.java:866 - Freed 0 triggers from 'acquired' / 'blocked' state.
[2024-01-22 15:21:37.154] INFO [Quartz Scheduler [CpopOamScheduler]] JobStoreSupport.java:876 - Recovering 0 jobs that were in-progress at the time of the last shut-down.
[2024-01-22 15:21:37.154] INFO [Quartz Scheduler [CpopOamScheduler]] JobStoreSupport.java:889 - Recovery complete.
[2024-01-22 15:21:37.188] INFO [Quartz Scheduler [CpopOamScheduler]] JobStoreSupport.java:896 - Removed 0 'complete' triggers.
[2024-01-22 15:21:37.224] INFO [Quartz Scheduler [CpopOamScheduler]] JobStoreSupport.java:901 - Removed 0 stale fired job entries.
[2024-01-22 15:21:37.294] INFO [Quartz Scheduler [CpopOamScheduler]] QuartzScheduler.java:547 - Scheduler CpopOamScheduler_$_NON_CLUSTERED started.
[2024-01-22 15:23:22.877] INFO [SpringApplicationShutdownHook] QuartzScheduler.java:585 - Scheduler CpopOamScheduler_$_NON_CLUSTERED paused.
[2024-01-22 15:23:23.203] INFO [SpringApplicationShutdownHook] LogAccessor.java:174 - Removing {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
[2024-01-22 15:23:23.203] INFO [SpringApplicationShutdownHook] LogAccessor.java:174 - Channel 'Cpop-Oam-Prod.errorChannel' has 0 subscriber(s).
[2024-01-22 15:23:23.203] INFO [SpringApplicationShutdownHook] LogAccessor.java:292 - stopped bean '_org.springframework.integration.errorLogger'
[2024-01-22 15:23:23.209] INFO [SpringApplicationShutdownHook] SchedulerFactoryBean.java:847 - Shutting down Quartz Scheduler
[2024-01-22 15:23:23.210] INFO [SpringApplicationShutdownHook] QuartzScheduler.java:666 - Scheduler CpopOamScheduler_$_NON_CLUSTERED shutting down.
[2024-01-22 15:23:23.210] INFO [SpringApplicationShutdownHook] QuartzScheduler.java:585 - Scheduler CpopOamScheduler_$_NON_CLUSTERED paused.
[2024-01-22 15:23:23.210] INFO [SpringApplicationShutdownHook] QuartzScheduler.java:740 - Scheduler CpopOamScheduler_$_NON_CLUSTERED shutdown complete.

View File

@ -58,9 +58,9 @@ mybatis-flex:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
datasource:
oam:
url: jdbc:mysql://localhost:3306/cpop_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/cpop_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Admin@123
password: Customer0401
jambox:
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/jambox_test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
username: root

View File

@ -61,7 +61,7 @@ mybatis-flex:
username: root
password: Customer0401
jambox:
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/jambox_association?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
url: jdbc:mysql://sh-cynosdbmysql-grp-fggo83js.sql.tencentcdb.com:20965/jambox_association?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: Customer0401

View File

@ -4,7 +4,13 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cpop.api.cloudDb.core.constant.CloudDbUrl;
import com.cpop.core.utils.SpringUtils;
import com.cpop.jambox.business.entity.BrandExtend;
import com.cpop.jambox.business.entity.StoreExtend;
import com.cpop.jambox.business.service.BrandExtendService;
import com.cpop.jambox.business.service.StoreExtendService;
import com.cpop.pay.framewok.handler.wxPay.WxPayHandler;
import com.cpop.system.business.entity.Store;
import com.cpop.system.business.service.StoreService;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
@ -20,6 +26,9 @@ import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
import static com.cpop.jambox.business.entity.table.BrandExtendTableDef.BRAND_EXTEND;
import static com.cpop.jambox.business.entity.table.StoreExtendTableDef.STORE_EXTEND;
/**
* @author DB
* @version 1.0.0
@ -51,7 +60,7 @@ public class CpopEasyLearnDataAnalyseTest{
.select("out_order_no")
.select("create_time")
.from("j_wx_pay_profit_sharing")
.where("create_time >= ?", "2024-04-08 19:00:00")
.where("create_time >= ?", "2024-04-16 00:00:00")
//.between("create_time", "2023-04-23 00:00:00","2023-11-13 22:00:00")
.list();
List<Row> insertList = new ArrayList<>();
@ -90,4 +99,31 @@ public class CpopEasyLearnDataAnalyseTest{
DataSourceKey.clear();
}
}
/**
* 获取子商户
*
* @author DB
* @since 2024/05/27
*/
@Test
public void getSubMchId() {
//获取校区
StoreExtend storeExtend = SpringUtils.getBean(StoreExtendService.class).queryChain().where(STORE_EXTEND.STORE_CLOUD_ID.eq("9e70c665649a9da70345cbe523284250")).one();
//获取品牌
BrandExtend brandExtend;
String brandId = null;
String storeId = null;
if (storeExtend == null) {
brandExtend = SpringUtils.getBean(BrandExtendService.class).queryChain().where(BRAND_EXTEND.BRAND_CLOUD_ID.eq("9e70c665649a9da70345cbe523284250")).one();
brandId = brandExtend.getBrandId();
} else {
//获取品牌
Store store = SpringUtils.getBean(StoreService.class).getById(storeExtend.getStoreId());
brandId = store.getBrandId();
storeId = storeExtend.getStoreId();
}
String subMchId = wxPayHandler.getSubMchId(brandId, storeId);
System.out.println(subMchId);
}
}

View File

@ -16,6 +16,7 @@ import com.cpop.jambox.business.service.StoreExtendService;
import com.cpop.jambox.framework.constant.JamboxCloudUrl;
import com.cpop.pay.framewok.config.wxPay.WxPayProperties;
import com.cpop.pay.framewok.handler.wxPay.WxPayHandler;
import com.cpop.pay.framewok.handler.wxPay.WxPayNormalHandler;
import com.github.binarywang.wxpay.bean.payscore.*;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingBillV3Request;
import com.github.binarywang.wxpay.bean.profitsharing.request.ProfitSharingReceiverRequest;
@ -328,8 +329,8 @@ public class CpopEasyLearnTest {
@Test
public void queryOrder() throws WxPayException {
WxPayService wxPayService = wxPayHandler.getWxPayService(null, "1666928264");
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002130202402224927801847",null);
WxPayService wxPayService = wxPayHandler.getWxPayService(null, wxPayHandler.getSubMchId("97561677443530752", "97571696801128452"));
WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder("4200002186202405135556568382",null);
System.out.println(JSONObject.toJSONString(wxPayOrderQueryResult));
}

View File

@ -6,7 +6,9 @@ import com.cpop.common.utils.StringUtils;
import com.cpop.core.base.enums.OrderSource;
import com.cpop.core.utils.SpringUtils;
import com.cpop.jambox.business.entity.*;
import com.cpop.jambox.business.mapper.EasyLearnOrderDetailMapper;
import com.cpop.jambox.business.service.*;
import com.cpop.jambox.framework.constant.JamboxCloudUrl;
import com.cpop.pay.framewok.handler.wxPay.WxPayHandler;
import com.cpop.system.business.entity.Store;
import com.cpop.system.business.entity.WxPayScore;
@ -16,22 +18,27 @@ import com.cpop.system.business.service.WxPayScoreDetailService;
import com.cpop.system.business.service.WxPayScoreService;
import com.github.binarywang.wxpay.bean.payscore.PartnerUserSignPlanEntity;
import com.github.binarywang.wxpay.bean.payscore.PayScorePlanDetailResult;
import com.github.binarywang.wxpay.bean.payscore.WxPartnerPayScoreResult;
import com.github.binarywang.wxpay.bean.payscore.WxPartnerPayScoreSignPlanResult;
import com.github.binarywang.wxpay.bean.profitsharing.result.ProfitSharingV3Result;
import com.github.binarywang.wxpay.bean.request.WxPayPartnerOrderQueryV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.bean.result.WxPayPartnerOrderQueryV3Result;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.PartnerPayScoreService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.*;
import com.mybatisflex.core.update.UpdateChain;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.math.RoundingMode;
@ -42,6 +49,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.cpop.jambox.business.entity.table.EasyLearnOrderDetailTableDef.EASY_LEARN_ORDER_DETAIL;
import static com.cpop.jambox.business.entity.table.EasyLearnOrderExtendTableDef.EASY_LEARN_ORDER_EXTEND;
import static com.cpop.jambox.business.entity.table.EasyLearnOrderTableDef.EASY_LEARN_ORDER;
import static com.cpop.jambox.business.entity.table.StoreExtendTableDef.STORE_EXTEND;
@ -110,7 +118,8 @@ public class CpopOldDataSyncTests {
.select("merchant_plan_no")
.select("sub_merch_id as subMchId")
.from("j_wechat_pay_plan")
.where("is_month = 0")
.where("create_time > '2024-05-08 11:25:30'")
//.where("is_month = 0")
.list();
} finally {
DataSourceKey.clear();
@ -175,7 +184,8 @@ public class CpopOldDataSyncTests {
.and("jct.pay_status = 'PAY'")
.and("jct.deleted = 1")
.and("jct.card_no is not null")
.and("jct.creation_time >= ?", LocalDateTime.of(2024, 1, 12, 16, 42))
.and("jct.creation_time > '2024-05-08 11:25:30'")
//.and("jct.creation_time >= ?", LocalDateTime.of(2024, 1, 12, 16, 42))
.list();
} finally {
DataSourceKey.clear();
@ -198,6 +208,7 @@ public class CpopOldDataSyncTests {
try {
PartnerUserSignPlanEntity partnerUserSignPlanEntity = wxPayService.getPartnerPayScoreSignPlanService()
.queryUserSignPlans(item.getString("orderId"), item.getString("subMchId"));
if (partnerUserSignPlanEntity != null){
EasyLearnOrder easyLearnOrder = new EasyLearnOrder();
String storeCloudId = item.getString("storeCloudId");
Integer extendStatus = changeStatus(partnerUserSignPlanEntity.getSignState());
@ -255,13 +266,62 @@ public class CpopOldDataSyncTests {
easyLearnOrderExtend.setCancelTime(LocalDateTime.parse(partnerUserSignPlanEntity.getCancelSignTime(),dateTimeFormatter));
}
easyLearnOrderExtends.add(easyLearnOrderExtend);
}
} catch (WxPayException e) {
throw new RuntimeException(e);
}
});
SpringUtils.getBean(EasyLearnOrderService.class).saveBatch(easyLearnOrders);
SpringUtils.getBean(EasyLearnOrderExtendService.class).saveBatch(easyLearnOrderExtends);
SpringUtils.getBean(EasyLearnOrderDetailService.class).saveBatch(easyLearnOrderDetails);
//去重
SpringUtils.getBean(EasyLearnOrderService.class).saveBatch(easyLearnOrders.stream().distinct().collect(Collectors.toList()));
SpringUtils.getBean(EasyLearnOrderExtendService.class).saveBatch(easyLearnOrderExtends.stream().distinct().collect(Collectors.toList()));
SpringUtils.getBean(EasyLearnOrderDetailService.class).saveBatch(easyLearnOrderDetails.stream().distinct().collect(Collectors.toList()));
}
/**
* 更新支付分支付时间
* @author DB
* @since 2024/5/13
*/
@Test
public void updatePayScoreDetailData() throws WxPayException {
//查询云函数
JSONObject jsonBody = new JSONObject();
jsonBody.put("_type", "merchantPayPlanList");
//订单id
jsonBody.put("startTime", "2024-05-08 11:25:30");
//获取课卡信息
JSONObject result = SpringUtils.getBean(RestTemplate.class).postForObject(JamboxCloudUrl.COMMON_CARD_URL, jsonBody, JSONObject.class);
assert result != null;
JSONArray data = result.getJSONArray("data");
List<Row> list = DbChain.table(EASY_LEARN_ORDER_DETAIL)
.select(EASY_LEARN_ORDER_DETAIL.ID, EASY_LEARN_ORDER_EXTEND.SUB_MCH_ID)
.from(EASY_LEARN_ORDER_DETAIL)
.leftJoin(EASY_LEARN_ORDER_EXTEND).on(EASY_LEARN_ORDER_EXTEND.ORDER_ID.eq(EASY_LEARN_ORDER_DETAIL.ORDER_ID))
.where(EASY_LEARN_ORDER_DETAIL.ID.in(data))
.list();
WxPayService wxPayService = wxPayHandler.getWxPayService();
PartnerPayScoreService partnerPayScoreService = wxPayService.getPartnerPayScoreService();
list.forEach(item -> {
WxPartnerPayScoreResult wxPartnerPayScoreResult = null;
try {
wxPartnerPayScoreResult = partnerPayScoreService.queryServiceOrder(null, item.getString("subMchId"), item.getString("id"), null);
item.put("transactionId", wxPartnerPayScoreResult.getCollection().getDetails().get(0).getTransactionId());
item.put("outOrderNo", wxPartnerPayScoreResult.getOrderId());
item.put("payTime", LocalDateTime.parse(wxPartnerPayScoreResult.getCollection().getDetails().get(0).getPaidTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
item.put("actualPrice", BigDecimal.valueOf(Long.valueOf(wxPartnerPayScoreResult.getCollection().getDetails().get(0).getAmount())).divide(new BigDecimal(100)));
} catch (WxPayException e) {
throw new RuntimeException(e);
}
});
Db.executeBatch(list, EasyLearnOrderDetailMapper.class, (mapper, item) -> {
UpdateChain.of(mapper)
.set(EASY_LEARN_ORDER_DETAIL.TRANSACTION_ID, item.getString("transactionId"))
.set(EASY_LEARN_ORDER_DETAIL.PAY_TIME, item.getLocalDateTime("payTime"))
.set(EASY_LEARN_ORDER_DETAIL.OUT_ORDER_NO, item.getString("outOrderNo"))
.set(EASY_LEARN_ORDER_DETAIL.ACTUAL_PRICE, item.getBigDecimal("actualPrice"))
.where(EASY_LEARN_ORDER_DETAIL.ID.eq(item.getString("id")))
.update();
});
}
private Integer changeStatus(String signStatus) {

View File

@ -0,0 +1,35 @@
package com.cpop.oam.business.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* @author DB
* @version 1.0.0
* @since 2024-05-29 11:18
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "续费订单请求对象")
public class RenewOrderBo {
/**
* id
*/
@NotBlank(message = "id不能为空")
@ApiModelProperty(value = "id",required = true)
private String id;
/**
* 价格
*/
@NotNull(message = "价格不能为空")
@ApiModelProperty(value = "价格",required = true)
private BigDecimal price;
}

View File

@ -0,0 +1,95 @@
package com.cpop.oam.business.controller.backstage;
import com.cpop.common.utils.StringUtils;
import com.cpop.core.base.R;
import com.cpop.core.base.entity.PageDomain;
import com.cpop.core.utils.sql.SqlUtils;
import com.cpop.oam.business.bo.RenewOrderBo;
import com.cpop.oam.business.vo.BrandManagePageVo;
import com.cpop.oam.business.vo.RenewOrderPageVo;
import com.cpop.system.business.vo.BrandListVo;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.row.DbChain;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author DB
* @version 1.0.0
* @since 2024-05-29 10:19
*/
@RestController
@Api(tags = "订单接口")
@RequestMapping("/backstage/order")
public class BackstageOrderController {
/**
* 获取续订订单分页
*
* @param storeName 校区名
* @return {@link R }<{@link Page }<{@link BrandManagePageVo }>>
* @author DB
* @since 2024/05/29
*/
@ApiOperation("获取续订订单分页")
@GetMapping("/getRenewOrderPage")
@PreAuthorize("@aps.hasPermission('order:storeRenew:list')")
public R<Page<RenewOrderPageVo>> getRenewOrderPage(@RequestParam(value = "storeName", required = false) String storeId) {
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
Page<RenewOrderPageVo> page = DataSourceKey.use("jambox", () -> {
if (StringUtils.isNotBlank(storeId)) {
return DbChain.table("t_signContract_ticket")
.select("tst.ticket_id as id", "tst.store_list as storeList", "tst.price as price", "if(tst.pay_status='PAY','已支付','待支付') as payStatus",
"tst.creation_time as createTime")
.select("(select tmi.mechanism from t_mechanism_info tmi where tmi.store_id = tst.store_list) as storeName")
.from("t_signContract_ticket").as("tst")
.where("pay_status = 'UNPAY'")
.and("store_list = ?", storeId)
.and("deleted = 1")
.orderBy("creation_time desc")
.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), RenewOrderPageVo.class);
} else {
return DbChain.table("t_signContract_ticket")
.select("tst.ticket_id as id", "tst.store_list as storeList", "tst.price as price", "if(tst.pay_status='PAY','已支付','待支付') as payStatus",
"tst.creation_time as createTime")
.select("(select tmi.mechanism from t_mechanism_info tmi where tmi.store_id = tst.store_list) as storeName")
.from("t_signContract_ticket").as("tst")
.where("pay_status = 'UNPAY'")
.and("deleted = 1")
.orderBy("creation_time desc")
.pageAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), RenewOrderPageVo.class);
}
});
return R.ok(page);
}
/**
* 更新续订订单
*
* @param query 查询
* @return {@link R }<{@link List }<{@link BrandListVo }>>
* @author DB
* @since 2024/05/29
*/
@ApiOperation("更新续订订单")
@PutMapping("/updateRenewOrder")
public R<List<BrandListVo>> updateRenewOrder(@RequestBody @Validated RenewOrderBo bo) {
DataSourceKey.use("jambox", () -> {
DbChain.table("t_signContract_ticket")
.set("price", bo.getPrice())
.set("last_modification_date", LocalDateTime.now())
.where("ticket_id = ?", bo.getId())
.update();
});
return R.ok();
}
}

View File

@ -6,17 +6,22 @@ import com.alibaba.excel.EasyExcel;
import com.cpop.api.tencent.wxWork.handler.WebHookSendHandler;
import com.cpop.common.utils.bean.BeanUtils;
import com.cpop.core.base.R;
import com.cpop.core.base.entity.PageDomain;
import com.cpop.core.base.exception.ServiceException;
import com.cpop.core.handler.TencentCosHandler;
import com.cpop.core.utils.SpringUtils;
import com.cpop.core.utils.file.FileUtils;
import com.cpop.core.utils.sql.SqlUtils;
import com.cpop.oam.business.bo.SummitApplyBo;
import com.cpop.oam.business.dto.SummitApplyDto;
import com.cpop.oam.business.entity.SummitApply;
import com.cpop.oam.business.entity.SummitApplyUser;
import com.cpop.oam.business.service.SummitApplyService;
import com.cpop.oam.business.service.SummitApplyUserService;
import com.cpop.oam.business.vo.SummitApplyPageVo;
import com.cpop.oam.framework.constant.WebHookKeyConstant;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.query.QueryWrapper;
import com.qcloud.cos.model.UploadResult;
import io.swagger.annotations.Api;
@ -38,6 +43,7 @@ import java.util.*;
import java.util.stream.Collectors;
import static com.cpop.oam.business.entity.table.SummitApplyTableDef.SUMMIT_APPLY;
import static com.cpop.oam.business.entity.table.SummitApplyUserTableDef.SUMMIT_APPLY_USER;
/**
* @author DB
@ -99,31 +105,54 @@ public class MiniSummitController {
@ApiOperation("峰会报名")
@PostMapping("/summitApply")
@Transactional(rollbackFor = Exception.class)
@Deprecated
public R<String> summitApply(@RequestBody @Validated SummitApplyBo bo) {
long count = summitApplyService.count(QueryWrapper.create().where(SUMMIT_APPLY.OPEN_ID.eq(bo.getOpenId())));
if (count > 0) {
throw new ServiceException("您已报名,请勿重复提交!");
// long count = summitApplyService.count(QueryWrapper.create().where(SUMMIT_APPLY.OPEN_ID.eq(bo.getOpenId())));
// if (count > 0) {
// throw new ServiceException("您已报名,请勿重复提交!");
// }
// SummitApply summitApply = BeanUtils.mapToClass(bo, SummitApply.class);
// summitApplyService.save(summitApply);
// List<SummitApplyUser> summitApplyUsers = BeanUtils.mapToList(bo.getUsers(), SummitApplyUser.class);
// summitApplyUsers.forEach(item->{
// item.setSummitApplyId(summitApply.getId());
// });
// summitApplyUserService.saveBatch(summitApplyUsers);
// // 企微通知值班人员
// List<String> phoneList = new ArrayList<String>();
// try {
// SpringUtils.getBean(WebHookSendHandler.class)
// .webHookSendText(WebHookKeyConstant.MARKET_BOT,
// phoneList,
// "==========2024峰会报名==========\n" +
// "机构" + bo.getStoreName() + "报名成功",
// true);
// } catch (IOException e) {
// throw new ServiceException("发送消息通知失败!");
// }
// return R.ok();
return R.fail("峰会报名已关闭");
}
SummitApply summitApply = BeanUtils.mapToClass(bo, SummitApply.class);
summitApplyService.save(summitApply);
List<SummitApplyUser> summitApplyUsers = BeanUtils.mapToList(bo.getUsers(), SummitApplyUser.class);
summitApplyUsers.forEach(item->{
item.setSummitApplyId(summitApply.getId());
});
summitApplyUserService.saveBatch(summitApplyUsers);
// 企微通知值班人员
List<String> phoneList = new ArrayList<String>();
try {
SpringUtils.getBean(WebHookSendHandler.class)
.webHookSendText(WebHookKeyConstant.MARKET_BOT,
phoneList,
"==========2024峰会报名==========\n" +
"机构" + bo.getStoreName() + "报名成功",
true);
} catch (IOException e) {
throw new ServiceException("发送消息通知失败!");
}
return R.ok();
/**
* 获取峰会申请分页
* @author DB
* @since 2024/4/10
*/
@ApiOperation(value = "获取峰会申请分页")
@GetMapping("/getSummitApplyPage")
public R<Page<SummitApplyPageVo>> getSummitApplyPage() {
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
Page<SummitApplyPageVo> page = summitApplyService.getMapper().paginateAs(Page.of(pageDomain.getPageNum(), pageDomain.getPageSize()), QueryWrapper.create()
.select(SUMMIT_APPLY.STORE_NAME,SUMMIT_APPLY.BOARD_NAME,SUMMIT_APPLY.IS_MEMBER,SUMMIT_APPLY.JOIN_NUM,SUMMIT_APPLY.ROOM_NUM,SUMMIT_APPLY.NEED_ROOM,
SUMMIT_APPLY.JOIN_PARTY,SUMMIT_APPLY.JOIN_MEETING,SUMMIT_APPLY.ID)
, SummitApplyPageVo.class,
item -> item.field(SummitApplyPageVo::getUsers).queryWrapper(users -> QueryChain.create()
.select(SUMMIT_APPLY_USER.NAME, SUMMIT_APPLY_USER.PHONE)
.from(SUMMIT_APPLY_USER)
.where(SUMMIT_APPLY_USER.SUMMIT_APPLY_ID.eq(users.getId())))
);
return R.ok(page);
}
/**

View File

@ -0,0 +1,58 @@
package com.cpop.oam.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author DB
* @version 1.0.0
* @since 2024-05-29 10:22
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "续费订单返回对象")
public class RenewOrderPageVo {
/**
* id
*/
@ApiModelProperty("id")
private String id;
/**
* 校区列表
*/
@ApiModelProperty("校区列表")
private String storeList;
/**
* 价格
*/
@ApiModelProperty("价格")
private BigDecimal price;
/**
* 支付状态
*/
@ApiModelProperty("支付状态")
private String payStatus;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
/**
* 校区名
*/
@ApiModelProperty("校区名")
private String storeName;
}

View File

@ -0,0 +1,95 @@
package com.cpop.oam.business.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author DB
* @version 1.0.0
* @since 2024-04-18 14:29
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "峰会提交申请分页")
public class SummitApplyPageVo {
/**
* 主键
*/
@ApiModelProperty("主键")
private String id;
/**
* 机构名称
*/
@ApiModelProperty("机构名称")
private String storeName;
/**
* 牌匾号
*/
@ApiModelProperty("牌匾号")
private String boardName;
/**
* 是否是会员
*/
@ApiModelProperty("是否是会员")
private String isMember;
/**
* 参会人数
*/
@ApiModelProperty("参会人数")
private Integer joinNum;
/**
* 房间数
*/
@ApiModelProperty("房间数")
private Integer roomNum;
/**
* 需要房间
*/
@ApiModelProperty("需要房间")
private String needRoom;
/**
* 参加晚宴
*/
@ApiModelProperty("参加晚宴")
private String joinParty;
/**
* 参加交流会
*/
@ApiModelProperty("参加交流会")
private String joinMeeting;
/**
* 用户信息
*/
@ApiModelProperty("用户信息")
private List<User> users;
@Data
public static class User {
/**
* 姓名
*/
@ApiModelProperty("姓名")
private String name;
/**
* 手机号
*/
@ApiModelProperty("手机号")
private String phone;
}
}

View File

@ -5,19 +5,20 @@ import com.cpop.common.utils.ServletUtils;
import com.cpop.common.utils.StringUtils;
import com.cpop.core.base.exception.ServiceException;
import com.cpop.core.utils.SecurityUtils;
import com.cpop.core.utils.SpringUtils;
import com.cpop.pay.framewok.config.wxPay.WxPayConfiguration;
import com.github.binarywang.wxpay.bean.ecommerce.SignatureHeader;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.mybatisflex.core.datasource.DataSourceKey;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Db;
import com.mybatisflex.core.row.DbChain;
import com.mybatisflex.core.row.Row;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.atomic.AtomicReference;
/**
* @author DB
@ -111,31 +112,56 @@ public class WxPayHandler {
* @return String
*/
public String getSubMchId(String brandId, String storeId) {
String wxMchId;
AtomicReference<String> subMchId = new AtomicReference<>("1618436087");
if (StringUtils.isNotEmpty(storeId)){
//先查校区
Row store = Db.selectOneByQuery("cp_sys_store", QueryWrapper.create().where("id = ?", storeId));
if (store != null && StringUtils.isNotBlank(store.getString("wxMchId"))){
wxMchId = store.getString("wxMchId");
} else {
Row store = Db.selectOneByQuery("cp_j_store_extend", QueryWrapper.create().select("store_cloud_id as storeCloudId").where("store_id = ?", storeId));
if (store != null && StringUtils.isNotBlank(store.getString("storeCloudId"))) {
AtomicReference<Row> row = new AtomicReference<>();
DataSourceKey.use("jambox", () -> {
row.set(Db.selectOneByQuery("j_merchant_info", QueryWrapper.create()
.select("j_merchant_info.wx_mch_id as wxMchId")
.from("j_merchant_info")
.leftJoin("t_mechanism_info").on("t_mechanism_info.mechanism_id = j_merchant_info.main_id")
.where("t_mechanism_info.store_id = ?", store.getString("storeCloudId"))
.and("j_merchant_info.main_type = 2")));
});
if (row.get() == null){
//查询品牌
Row brand = Db.selectOneByQuery("cp_sys_brand", QueryWrapper.create().where("id = ?", brandId));
if (brand != null && StringUtils.isNotBlank(brand.getString("wxMchId"))){
wxMchId = brand.getString("wxMchId");
Row brand = Db.selectOneByQuery("cp_j_brand_extend", QueryWrapper.create().select("brand_cloud_id as brandCloudId").where("brand_id = ?", brandId));
if (brand != null && StringUtils.isNotBlank(brand.getString("brandCloudId"))){
DataSourceKey.use("jambox", () -> {
row.set(DbChain.table("j_merchant_info")
.select("j_merchant_info.wx_mch_id as wxMchId")
.leftJoin("t_brand_info").on("t_brand_info.id = j_merchant_info.main_id")
.where("t_brand_info.brand_id = ?", brand.getString("brandCloudId"))
.and("j_merchant_info.main_type = 1").one());
if (row.get() != null){
subMchId.set(row.get().getString("wxMchId"));
}
});
}
} else {
wxMchId = null;
subMchId.set(row.get().getString("wxMchId"));
}
}
} else {
//查询品牌
Row brand = Db.selectOneByQuery("cp_sys_brand", QueryWrapper.create().where("id = ?", brandId));
if (brand != null && StringUtils.isNotBlank(brand.getString("wxMchId"))){
wxMchId = brand.getString("wxMchId");
}else {
wxMchId = null;
Row brand = Db.selectOneByQuery("cp_j_brand_extend", QueryWrapper.create().select("brand_cloud_id as brandCloudId").where("brand_id = ?", brandId));
if (brand != null && StringUtils.isNotBlank(brand.getString("brandCloudId"))){
DataSourceKey.use("jambox", () -> {
Row row = DbChain.table("j_merchant_info")
.select("j_merchant_info.wx_mch_id as wxMchId")
.leftJoin("t_brand_info").on("t_brand_info.id = j_merchant_info.main_id")
.where("t_brand_info.brand_id = ?", brand.getString("brandCloudId"))
.and("j_merchant_info.main_type = 1").one();
if (row != null){
subMchId.set(row.getString("wxMchId"));
}
});
}
}
return wxMchId;
return subMchId.get();
}
/**