商城售后

master
xiaoning 1 month ago
parent b0fd97fe6d
commit 1d86ef3d03

@ -1,68 +1,5 @@
## 平台简介
https://gitee.com/zccbbg/RuoYi-Mall.git
若依是一套全部开源的快速开发平台毫无保留给个人及企业免费使用。我们在此基础上开发了ruoyi-mall希望能给做商城的朋友减轻工作量。
* 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。
* 权限认证使用Jwt支持多终端认证系统。
* 支持加载动态权限菜单,多方式轻松权限控制。
* 高效率开发,使用代码生成器可以一键生成前后端代码。
## B站讲解视频
https://www.bilibili.com/video/BV16N4y1d7MM
## 若依视频教程
对若依框架不了解不知道怎么部署、修改密码等操作的请参考https://www.bilibili.com/video/BV1Fi4y1q74p/
## 本地运行文档
https://docs.ichengle.top/mall/run.html
## 系统部署文档
https://docs.ichengle.top/mall/ops.html
## 特别注意
jdk请选择1.8~11之间的不然mybaties会报错
## 项目地址
| | gitee | github |
|:--------------:|:----------------------------------------|:---------------------------------------------|
| 管理端vue element | https://gitee.com/zccbbg/ruoyi-mall-vue | https://github.com/zccbbg/ruoyi-mall-vue |
| h5 uniapp | https://gitee.com/zccbbg/ruoyi-mall-uniapp | https://github.com/zccbbg/ruoyi-mall-uniapp |
## 在线体验
### 管理后台演示地址
http://mall.ichengle.top
### 小程序和h5
<img src="doc/小程序演示.jpg" width="200px">
<img src="doc/h5演示.png" width="200px">
## 若依技术专栏
关注文末公众号回复:星球
## 若依mall功能
1. 首页:
![img.png](doc/首页.png)
2. PMS商品管理
![img.png](doc/商品.png)
![img.png](doc/商品列表.png)
3. UMS会员管理
会员列表:
![img.png](doc/会员列表.png)
购物车:
![img.png](doc/会员购物车.png)
4. OMS订单管理
订单列表:
![img.png](doc/订单.png)
售后列表:
![img.png](doc/售后.png)
5. SMS营销管理
![img.png](doc/优惠券.png)
![img.png](doc/积分.png)
6. CMS内容管理
![img.png](doc/内容管理.png)
## 科技企业招聘、内推渠道
如果投简历经常已读不回,可以试试这个小程序,回复率相对高一点:
![内推](doc/内推.png)
## 交流群/技术支持
| 公众号 |
|:------------------------------------------:|
| <img src="doc/datacall.jpg" width="200px"> |
扫公众号二维码,关注后,回复:“加群”
打包前修改数据库连接配置类:
com.ruoyi.common.db.SshContextListener
注释掉:@Component @WebListener

@ -1,15 +1,12 @@
package cn.xluobo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.UnknownHostException;
@SpringBootApplication(scanBasePackages = {"cn.xluobo","cn.jljiayu"})
@EnableTransactionManagement
@MapperScan(value = {"cn.xluobo.*.*.*.repo.mapper"})
//@SpringBootApplication(scanBasePackages = {"cn.xluobo","cn.jljiayu"})
//@EnableTransactionManagement
//@MapperScan(value = {"cn.xluobo.*.*.*.repo.mapper"})
public class OauthServerApplication {
public static void main(String[] args) throws UnknownHostException {

@ -1,5 +1,7 @@
package cn.xluobo.business.sc.course.domain.resp;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Builder;
import lombok.Data;
@ -15,6 +17,7 @@ import java.util.List;
@Builder
public class RespBusinessChooseCourseInfo {
@JsonSerialize(using = ToStringSerializer.class)
private Long courseId;
private String courseName;

@ -17,6 +17,7 @@ import java.util.List;
public class ReqBusinessSignUp {
private Long studentId;
private Long commissionPlansId;
// 经办校区
private Long handleDepartId;

@ -1,5 +1,7 @@
package cn.xluobo.business.sc.order.domain.resp;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.math.BigDecimal;
@ -11,6 +13,8 @@ import java.math.BigDecimal;
@Data
public class RespOrder {
@JsonSerialize(using = ToStringSerializer.class)
private Long orderId;
private String orderType;

@ -5,9 +5,9 @@
<select id="selectFroSearchTable" resultType="cn.xluobo.business.sc.order.domain.resp.RespOrder">
select
a.order_id,a.order_type,a.actual_total_fee,a.receipt_fee,a.balance_fee,
(select s.staff_name from sys_staff s where s.staff_id=a.sale_staff_id) sale_staff_name,
(select s.nick_name from sys_user s where s.user_id=a.sale_staff_id) sale_staff_name,
a.order_tag,a.handle_dept_name,a.handle_date,
(select u.name from sys_user u where user_id=a.create_user) as create_user_name,
(select u.nick_name from sys_user u where user_id=a.create_user) as create_user_name,
a.memo,
b.student_name,b.phone,
(select group_concat(od.course_name,'(',d.dept_name,')',',',od.charge_name,' 数量:',od.buy_count separator ';') from sc_order_detail od left join sys_dept d on od.dept_id=d.dept_id where a.order_id=od.order_id) as order_detail,

@ -35,6 +35,9 @@ public class ScOrder implements Serializable {
@TableId(value = "order_id", type = IdType.ASSIGN_ID)
private Long orderId;
@TableField("commission_plans_id")
private Long commissionPlansId;;
/**
*
*/
@ -172,4 +175,6 @@ public class ScOrder implements Serializable {
*/
@TableField(exist = false)
private String handleStaffName;
}

@ -21,6 +21,8 @@ import cn.xluobo.business.sc.order.repo.mapper.ScOrderMapper;
import cn.xluobo.business.sc.order.repo.model.ScOrder;
import cn.xluobo.business.sc.order.repo.model.ScOrderAccount;
import cn.xluobo.business.sc.order.repo.model.ScOrderDetail;
import cn.xluobo.business.sc.salary.repo.model.ScCommissionPlans;
import cn.xluobo.business.sc.salary.service.ScCommissionPlansService;
import cn.xluobo.business.sc.student.repo.model.ScStudent;
import cn.xluobo.business.sc.student.repo.model.ScStudentCourse;
import cn.xluobo.business.sc.student.repo.model.ScStudentCourseOrder;
@ -32,7 +34,6 @@ import cn.xluobo.business.sys.admin.service.ISysDeptService;
import cn.xluobo.business.sys.admin.service.ISysUserService;
import cn.xluobo.business.sys.receipt.repo.model.SysReceiptAccount;
import cn.xluobo.business.sys.receipt.service.ISysReceiptAccountService;
import cn.xluobo.business.sys.staff.repo.model.SysStaff;
import cn.xluobo.business.sys.staff.service.ISysStaffService;
import cn.xluobo.business.sys.tag.service.ISysTagService;
import cn.xluobo.config.exception.BusinessException;
@ -92,6 +93,8 @@ public class BusinessScOrderService {
@Autowired
private IScStudentService studentService;
@Autowired
private ScCommissionPlansService commissionPlansService;
@Autowired
private ISysDeptService deptService;
@Autowired
private IScStudentAccountService studentAccountService;
@ -137,8 +140,8 @@ public class BusinessScOrderService {
ScOrder order = scOrderService.getById(orderId);
// 经办人姓名
if (null != order.getCreateUser()) {
SysUser user = userService.getById(order.getCreateUser());
order.setHandleStaffName(user.getUserName());
SysUser user = userService.getOne(new QueryWrapper<SysUser>().select("nick_name").eq("user_id",order.getCreateUser()));
order.setHandleStaffName(user.getNickName());
}
detailMap.put("orderInfo", order);
@ -176,7 +179,10 @@ public class BusinessScOrderService {
if (null == handleDept) {
return APIResponse.toExceptionResponse("无法获取经办校区信息,请重试!");
}
ScCommissionPlans commissionPlans= commissionPlansService.getById(reqBusinessSignUp.getCommissionPlansId());
if (null == commissionPlans) {
return APIResponse.toExceptionResponse("无法获取经佣金信息,请重试!");
}
BigDecimal reqReceiptWaySumMoney = reqBusinessSignUp.getReceiptWaySumMoney();
List<ReqBusinessSignUpReceipt> signUpReceiptList = reqBusinessSignUp.getSignUpReceiptList();
List<ReqBusinessSignUpItem> signUpItemList = reqBusinessSignUp.getSignUpItemList();
@ -268,6 +274,7 @@ public class BusinessScOrderService {
.handleDate(reqBusinessSignUp.getHandleDate())
.createUser(loginUser.getUserId())
.lastUpdateUser(loginUser.getUserId())
.commissionPlansId(reqBusinessSignUp.getCommissionPlansId())
.build();
if (null != reqBusinessSignUp.getOrderTag()) {
@ -277,14 +284,14 @@ public class BusinessScOrderService {
order.setSaleSourceTag(String.join(",", reqBusinessSignUp.getSaleSourceTag()));
}
if (null != reqBusinessSignUp.getSaleStaffId()) {
SysStaff saleStaff = staffService.getById(reqBusinessSignUp.getSaleStaffId());
SysUser saleStaff = userService.getOne(new QueryWrapper<SysUser>().select("user_id","nick_name").eq("user_id",reqBusinessSignUp.getSaleStaffId()));
if (null == saleStaff) {
throw new BusinessException("无法获取销售员工信息");
}
order.setSaleStaffId(saleStaff.getStaffId());
order.setSaleStaffName(saleStaff.getStaffName());
order.setSaleStaffId(saleStaff.getUserId());
order.setSaleStaffName(saleStaff.getNickName());
}
order.setTenantId(SecurityUtils.getLoginUser().getNowTenantId());
scOrderService.save(order);
orderId = order.getOrderId();
log.info("save order success,orderId={}", orderId);
@ -472,6 +479,7 @@ public class BusinessScOrderService {
addStudentCourse.setStatus("1");
addStudentCourse.setCreateUser(loginUser.getUserId());
addStudentCourse.setLastUpdateUser(loginUser.getUserId());
addStudentCourse.setTenantId(SecurityUtils.getLoginUser().getNowTenantId());
studentCourseService.save(addStudentCourse);
studentCourseId = addStudentCourse.getStudentCourseId();
}

@ -6,16 +6,13 @@ import cn.xluobo.business.sc.salary.repo.model.ScCommissionPlans;
import cn.xluobo.business.sc.salary.service.ScCommissionPlansService;
import cn.xluobo.core.page.RespPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cyl.h5.config.SecurityUtil;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@ -36,6 +33,13 @@ public class ScCommissionPlansController {
return AjaxResult.success(page1);
}
@GetMapping("/listAll")
public AjaxResult listAll(){
List<ScCommissionPlans> page1 = service.list( Wrappers.<ScCommissionPlans>lambdaQuery()
.eq(ScCommissionPlans::getIsActive, 1)
);
return AjaxResult.success(page1);
}
@PostMapping("saveOrEdit")
public AjaxResult saveOrEdit(@RequestBody ScCommissionPlans salaryBase){
LoginUser loginUser = SecurityUtils.getLoginUser();

@ -130,5 +130,5 @@ public class ScStudentCourse implements Serializable {
@TableField("last_update_time")
private Date lastUpdateTime;
private String tenantId;
}

@ -10,7 +10,6 @@ import com.google.common.collect.Lists;
import com.ruoyi.common.core.domain.entity.SysDictData;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.List;
@ -27,7 +26,7 @@ import java.util.List;
public class ISysDictDataServiceImpl extends ServiceImpl<ISysDictDataMapper, SysDictData> implements ISysDictDataService {
@Override
@Cacheable(value = "SYS_DICT_DATA", key = "#dictType", sync = true)
// @Cacheable(value = "SYS_DICT_DATA", key = "#dictType", sync = true)
public List<SysDictData> dictTypeDataList(String dictType) {
if (StringUtils.isEmpty(dictType)) {
return Lists.newArrayList();

@ -1,16 +1,23 @@
package com.ruoyi.web.controller.common;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.RestResponse;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.mall.domain.dto.AddressDTO;
import com.ruoyi.mall.mapper.AddressMapper;
import com.ruoyi.system.service.FileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.mall.domain.Address;
import java.util.*;
import java.util.stream.Collectors;
/**
*
@ -29,6 +36,12 @@ public class CommonController
private final FileService fileService;
private final RedisService redisService;
private final AddressMapper addressMapper;
@Operation(summary = "上传课程相关图片", description = "上传图片,上传后返回原图和缩略图的url")
@PostMapping("/courseImage/upload")
public RestResponse uploadCourseImage(@RequestParam("file") MultipartFile file) {
@ -47,6 +60,53 @@ public class CommonController
return new RestResponse().setSuccess(true).setCode(200).setData(fileService.uploadFile(file));
}
@GetMapping("/common/area")
public AjaxResult getAddressList() {
String addresses = redisService.getAddressList();
if (org.apache.commons.lang3.StringUtils.isNotEmpty(addresses)) {
List<AddressDTO> addressDTOList = JSON.parseArray(addresses, AddressDTO.class);
if(addressDTOList.size()>0){
return AjaxResult.success(addressDTOList);
}
}
QueryWrapper<Address> addressQueryWrapper = new QueryWrapper<>();
addressQueryWrapper.in("level", Arrays.asList(0,1,2));
List<Address> addressList = addressMapper.selectList(addressQueryWrapper);
Map<Long, List<Address>> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode()));
Map<Long, List<Address>> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode()));
List<AddressDTO> result = new ArrayList<>();
addressList.stream().filter(it -> it.getLevel() == 0).forEach(it -> {
AddressDTO dto = new AddressDTO();
dto.setId(it.getCode());
dto.setLevel("province");
dto.setName(it.getName());
dto.setPid(0L);
//获取城市列表
List<AddressDTO> child = new ArrayList<>();
if (cityMap.containsKey(it.getCode())) {
cityMap.get(it.getCode()).forEach(city -> {
AddressDTO cityDto = new AddressDTO();
cityDto.setId(city.getCode());
cityDto.setLevel("city");
cityDto.setName(city.getName());
cityDto.setPid(city.getParentCode());
cityDto.setChildren(districtMap.containsKey(city.getCode()) ?
districtMap.get(city.getCode()).stream().map(district -> {
AddressDTO districtDto = new AddressDTO();
districtDto.setId(district.getCode());
districtDto.setLevel("district");
districtDto.setName(district.getName());
districtDto.setPid(district.getParentCode());
return districtDto;
}).collect(Collectors.toList()) : Collections.EMPTY_LIST);
child.add(cityDto);
});
}
dto.setChildren(child);
result.add(dto);
});
redisService.setAddressList(JSON.toJSONString(result));
return AjaxResult.success(result);
}
}

@ -0,0 +1,107 @@
package com.ruoyi.web.controller.mall;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.mall.domain.Aftersale;
import com.ruoyi.mall.domain.form.DealWithAftersaleForm;
import com.ruoyi.mall.domain.form.ManagerAftersaleOrderForm;
import com.ruoyi.mall.domain.vo.ManagerRefundOrderDetailVO;
import com.ruoyi.mall.domain.vo.ManagerRefundOrderVO;
import com.ruoyi.mall.domain.vo.OrderOperateHistoryVO;
import com.ruoyi.mall.service.AftersaleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller
*
* @author zcc
* @date 2022-12-29
*/
@Api(description ="订单售后接口列表")
@RestController
@RequestMapping("/oms/aftersale")
@Slf4j
public class AftersaleController extends BaseController {
@Autowired
private AftersaleService service;
@Autowired
private RedisService redisService;
@ApiOperation("查询订单售后列表")
@PreAuthorize("@ss.hasPermi('oms:aftersale:list')")
@PostMapping("/list")
public ResponseEntity<Page<ManagerRefundOrderVO>> list(@RequestBody ManagerAftersaleOrderForm query, Pageable page) {
List<ManagerRefundOrderVO> list = service.selectList(query, page);
return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal()));
}
// @ApiOperation("导出订单售后列表")
// @PreAuthorize("@ss.hasPermi('oms:aftersale:export')")
// @Log(title = "订单售后", businessType = BusinessType.EXPORT)
// @GetMapping("/export")
// public ResponseEntity<String> export(AftersaleQuery query) {
// List<Aftersale> list = service.selectList(query, null);
// ExcelUtil<AftersaleVO> util = new ExcelUtil<>(AftersaleVO.class);
// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单售后数据"));
// return null;
// }
@ApiOperation("获取订单售后详细信息")
@PreAuthorize("@ss.hasPermi('oms:aftersale:query')")
@GetMapping(value = "/{id}")
public ResponseEntity<ManagerRefundOrderDetailVO> getInfo(@PathVariable("id") Long orderId) {
return ResponseEntity.ok(service.selectById(orderId));
}
@ApiOperation("修改订单售后")
@PreAuthorize("@ss.hasPermi('oms:aftersale:edit')")
@Log(title = "订单售后", businessType = BusinessType.UPDATE)
@PutMapping
public ResponseEntity<Integer> edit(@RequestBody Aftersale aftersale) {
return ResponseEntity.ok(service.update(aftersale));
}
@ApiOperation("售后订单操作")
@PostMapping("/dealWith")
public ResponseEntity<Boolean> updateStatus(@RequestBody DealWithAftersaleForm request){
LoginUser user = SecurityUtils.getLoginUser();
String redisKey = "manager_oms_order_updateOrderStatus_" + user.getUserId();
String redisValue = user.getUserId() + "_" + System.currentTimeMillis();
try {
redisService.lock(redisKey, redisValue, 60);
service.dealWith(request, user.getUserId(), user.getUser().getNickName());
return ResponseEntity.ok(true);
} catch (Exception e) {
log.error("售后订单操作发生异常", e);
throw new RuntimeException(e.getMessage());
} finally {
try {
redisService.unLock(redisKey, redisValue);
} catch (Exception e) {
log.error("", e);
}
}
}
@ApiOperation("查看日志")
@GetMapping("/log/{orderId}")
public ResponseEntity<List<OrderOperateHistoryVO>> log(@PathVariable Long orderId){
return ResponseEntity.ok(service.log(orderId));
}
}

@ -0,0 +1,85 @@
package com.ruoyi.web.controller.mall;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.mall.domain.Express;
import com.ruoyi.mall.service.ExpressService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller
*/
@Api(description ="快递管理接口列表")
@RestController
@RequestMapping("/pms/express")
public class ExpressController extends BaseController {
@Autowired
private ExpressService service;
@ApiOperation("查询快递管理列表")
@PreAuthorize("@ss.hasPermi('pms:Express:list')")
@PostMapping("/list")
public ResponseEntity<Page<Express>> list(@RequestBody Express query, Pageable page) {
List<Express> list = service.selectList(query, page);
return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal()));
}
@ApiOperation("所有快递管理列表")
@PreAuthorize("@ss.hasPermi('pms:Express:list')")
@PostMapping("/all")
public ResponseEntity<List<Express>> all(@RequestBody Express query) {
return ResponseEntity.ok(service.selectList(query, null));
}
@ApiOperation("导出快递管理列表")
@PreAuthorize("@ss.hasPermi('pms:Express:export')")
@Log(title = "快递管理", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public ResponseEntity<String> export(Express query) {
// List<Express> list = service.selectList(query, null);
// ExcelUtil<ExpressVO> util = new ExcelUtil<>(ExpressVO.class);
// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "快递管理数据"));
return null;
}
@ApiOperation("获取快递管理详细信息")
@PreAuthorize("@ss.hasPermi('pms:Express:query')")
@GetMapping(value = "/{id}")
public ResponseEntity<Express> getInfo(@PathVariable("id") Long id) {
return ResponseEntity.ok(service.selectById(id));
}
@ApiOperation("新增快递管理")
@PreAuthorize("@ss.hasPermi('pms:Express:add')")
@Log(title = "快递管理", businessType = BusinessType.INSERT)
@PostMapping
public ResponseEntity<Integer> add(@RequestBody Express Express) {
return ResponseEntity.ok(service.insert(Express));
}
@ApiOperation("修改快递管理")
@PreAuthorize("@ss.hasPermi('pms:Express:edit')")
@Log(title = "快递管理", businessType = BusinessType.UPDATE)
@PutMapping
public ResponseEntity<Integer> edit(@RequestBody Express Express) {
return ResponseEntity.ok(service.update(Express));
}
@ApiOperation("删除快递管理")
@PreAuthorize("@ss.hasPermi('pms:Express:remove')")
@Log(title = "快递管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Integer> remove(@PathVariable Long id) {
return ResponseEntity.ok(service.deleteById(id));
}
}

@ -0,0 +1,141 @@
package com.ruoyi.web.controller.mall;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.mall.domain.Order;
import com.ruoyi.mall.domain.query.DeliverProductForm;
import com.ruoyi.mall.domain.query.ManagerOrderQueryForm;
import com.ruoyi.mall.domain.vo.ManagerOrderDetailVO;
import com.ruoyi.mall.domain.vo.ManagerOrderVO;
import com.ruoyi.mall.domain.vo.OrderOperateHistoryVO;
import com.ruoyi.mall.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* Controller
*
* @author
* @date 2022-12-01
*/
@Api(description ="订单表接口列表")
@RestController
@RequestMapping("/oms/order")
@Slf4j
public class OrderController extends BaseController {
@Autowired
private OrderService service;
@Autowired
private RedisService redisService;
@ApiOperation("查询订单表列表")
@PreAuthorize("@ss.hasPermi('oms:order:list')")
@PostMapping("/list")
public ResponseEntity<Page<ManagerOrderVO>> list(@RequestBody ManagerOrderQueryForm query, Pageable page) {
return ResponseEntity.ok(service.selectList(query, page));
}
@ApiOperation("修改收件人信息")
@PostMapping("/receiver/update")
public ResponseEntity<Boolean> updateReceiver(@RequestBody Order order) {
return ResponseEntity.ok(service.updateReceiver(order));
}
// @ApiOperation("导出订单表列表")
// @PreAuthorize("@ss.hasPermi('oms:order:export')")
// @Log(title = "订单表", businessType = BusinessType.EXPORT)
// @GetMapping("/export")
// public ResponseEntity<String> export(OrderQuery query) {
// List<Order> list = service.selectList(query, null);
// ExcelUtil<OrderVO> util = new ExcelUtil<>(OrderVO.class);
// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单表数据"));
// return null;
// }
@ApiOperation("获取订单表详细信息")
@PreAuthorize("@ss.hasPermi('oms:order:query')")
@GetMapping(value = "/{id}")
public ResponseEntity<ManagerOrderDetailVO> getInfo(@PathVariable("id") Long id) {
return ResponseEntity.ok(service.selectById(id));
}
@ApiOperation("新增订单表")
@PreAuthorize("@ss.hasPermi('oms:order:add')")
@Log(title = "订单表", businessType = BusinessType.INSERT)
@PostMapping
public ResponseEntity<Integer> add(@RequestBody Order order) {
return ResponseEntity.ok(service.insert(order));
}
@ApiOperation("修改订单表")
@PreAuthorize("@ss.hasPermi('oms:order:edit')")
@Log(title = "订单表", businessType = BusinessType.UPDATE)
@PutMapping
public ResponseEntity<Integer> edit(@RequestBody Order order) {
return ResponseEntity.ok(service.update(order));
}
@ApiOperation("删除订单表")
@PreAuthorize("@ss.hasPermi('oms:order:remove')")
@Log(title = "订单表", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Integer> remove(@PathVariable Long id) {
return ResponseEntity.ok(service.deleteById(id));
}
@ApiOperation("添加备注")
@PreAuthorize("@ss.hasPermi('oms:order:note:add')")
@Log(title = "订单表", businessType = BusinessType.UPDATE)
@PostMapping("/merchantNote/add")
public ResponseEntity<Integer> saveMerchantNote(@RequestBody Order order){
return ResponseEntity.ok(service.saveMerchantNote(order));
}
@ApiOperation("管理后台订单发货")
@PreAuthorize("@ss.hasPermi('oms:order:delivery')")
@PostMapping("/deliverProduct")
public ResponseEntity<String> delivery(@RequestBody DeliverProductForm request){
Long userId = SecurityUtils.getUserId();
String redisKey = "oms_order_deliverProduct" + request.getOrderId();
String redisValue = request.getOrderId() + "_" + System.currentTimeMillis();
try{
redisService.lock(redisKey, redisValue, 60);
return ResponseEntity.ok(service.deliverProduct(request, userId));
}catch (Exception e){
log.error("订单发货接口异常");
throw new RuntimeException("发货失败");
}finally {
try{
redisService.unLock(redisKey, redisValue);;
}catch (Exception e){
log.error("", e);
}
}
}
@ApiOperation("订单日志")
@GetMapping("/log/{orderId}")
public ResponseEntity<List<OrderOperateHistoryVO>> log(@PathVariable Long orderId){
return ResponseEntity.ok(service.log(orderId));
}
@PreAuthorize("@ss.hasAnyRoles('admin')")
@ApiOperation("订单解密")
@GetMapping("/decryptPhone/{orderId}")
public ResponseEntity<String> decryptPhone(@PathVariable Long orderId){
String decryptPhone = service.decryptPhone(orderId);
return ResponseEntity.ok(decryptPhone);
}
}

@ -1,7 +1,9 @@
package com.ruoyi.web.controller.mall;
import cn.hutool.core.util.ObjectUtil;
import cn.xluobo.business.sc.course.domain.req.ReqSearchScCourse;
import cn.xluobo.business.sc.course.domain.resp.course.RespSearchCourse;
import cn.xluobo.business.sc.course.repo.model.ScCourse;
import cn.xluobo.business.sc.course.service.IScCourseService;
import cn.xluobo.core.page.RespPage;
import com.ruoyi.common.annotation.Log;
@ -62,7 +64,14 @@ public class ProductController extends BaseController {
@PreAuthorize("@ss.hasPermi('pms:product:query')")
@GetMapping(value = "/{id}")
public ResponseEntity<ProductVO> getInfo(@PathVariable("id") Long id) {
return ResponseEntity.ok(service.selectById(id));
ProductVO productVO= service.selectById(id);
if (productVO.getIsCourse()==1)
{
ScCourse course= courseService.getById(productVO.getCourseId());
productVO.setCourseName(ObjectUtil.isNotEmpty(course)?course.getCourseName():"**课程不存在**");
}
return ResponseEntity.ok(productVO);
}
@ApiOperation("新增商品信息")

@ -0,0 +1,85 @@
package com.ruoyi.web.controller.mall;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.mall.domain.Sku;
import com.ruoyi.mall.domain.query.SkuQuery;
import com.ruoyi.mall.domain.vo.SkuVO;
import com.ruoyi.mall.service.SkuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* skuController
*
* @author zcc
* @date 2022-11-28
*/
@Api(description ="sku信息接口列表")
@RestController
@RequestMapping("/pms/sku")
public class SkuController extends BaseController {
@Autowired
private SkuService service;
@ApiOperation("查询sku信息列表")
@PreAuthorize("@ss.hasPermi('pms:sku:list')")
@PostMapping("/list")
public ResponseEntity<Page<Sku>> list(@RequestBody SkuQuery query, Pageable page) {
service.getOutProductId(query);
List<Sku> list = service.selectList(query, page);
return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal()));
}
@ApiOperation("导出sku信息列表")
@PreAuthorize("@ss.hasPermi('pms:sku:export')")
@Log(title = "sku信息", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public ResponseEntity<String> export(SkuQuery query) {
List<Sku> list = service.selectList(query, null);
ExcelUtil<SkuVO> util = new ExcelUtil<>(SkuVO.class);
return ResponseEntity.ok(util.writeExcel(BeanUtil.copyToList(list,SkuVO.class), "sku信息数据"));
}
@ApiOperation("获取sku信息详细信息")
@PreAuthorize("@ss.hasPermi('pms:sku:query')")
@GetMapping(value = "/{id}")
public ResponseEntity<Sku> getInfo(@PathVariable("id") Long id) {
return ResponseEntity.ok(service.selectById(id));
}
@ApiOperation("新增sku信息")
@PreAuthorize("@ss.hasPermi('pms:sku:add')")
@Log(title = "sku信息", businessType = BusinessType.INSERT)
@PostMapping
public ResponseEntity<Integer> add(@RequestBody Sku sku) {
return ResponseEntity.ok(service.insert(sku));
}
@ApiOperation("修改sku信息")
@PreAuthorize("@ss.hasPermi('pms:sku:edit')")
@Log(title = "sku信息", businessType = BusinessType.UPDATE)
@PutMapping
public ResponseEntity<Integer> edit(@RequestBody Sku sku) {
return ResponseEntity.ok(service.update(sku));
}
@ApiOperation("删除sku信息")
@PreAuthorize("@ss.hasPermi('pms:sku:remove')")
@Log(title = "sku信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public ResponseEntity<Integer> remove(@PathVariable Long id) {
return ResponseEntity.ok(service.deleteById(id));
}
}

@ -1,18 +1,5 @@
package com.ruoyi.web.controller.system;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
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.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
@ -23,10 +10,17 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
*
*
*
* @author ruoyi
*/
@RestController
@ -91,6 +85,7 @@ public class SysDictDataController extends BaseController
SysDictData query = new SysDictData();
query.getParams().put("dictTypes", dictTypes);
List<SysDictData> data = dictDataService.selectDictDataList(query);
if (StringUtils.isNull(data))
{
data = new ArrayList<>();

@ -61,10 +61,12 @@ public class SysUserController extends BaseController
public TableDataInfo listAll(SysUser user)
{
// startPage();
user.setDeptId(getDeptId());
List<SysUser> list = userService.selectUserList(user);
return getDataTable(list);
}
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('system:user:export')")
@GetMapping("/export")

@ -6,14 +6,12 @@ import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.data.annotation.Id;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* sys_dept
@ -175,10 +173,10 @@ public class SysDept extends BaseEntity
this.deleteFlag = deleteFlag;
}
@Override
public Map<String, Object> getParams() {
return null;
}
// @Override
// public Map<String, Object> getParams() {
// return null;
// }
public String getParentName()
{

@ -1,5 +1,15 @@
package com.ruoyi.framework.web.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysTenant;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.impl.SysTenantServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -7,12 +17,6 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysUserService;
/**
*
@ -27,6 +31,8 @@ public class UserDetailsServiceImpl implements UserDetailsService
@Autowired
private ISysUserService userService;
@Autowired
private SysTenantServiceImpl tenantService;
@Autowired
private SysPermissionService permissionService;
@ -34,6 +40,11 @@ public class UserDetailsServiceImpl implements UserDetailsService
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
SysUser user = userService.selectUserByUserName(username);
SysTenant tenant=tenantService.getById(user.getTenantId());
if (ObjectUtil.isEmpty(tenant) || !tenant.getInUse().equals("0") || !DateUtil.date().before(tenant.getEndTime()) ){
log.info("用户所属租户:{} 异常.", tenant.getTenantName());
throw new ServiceException("用户所属租户:" + tenant.getTenantName() + " 异常");
}
if (StringUtils.isNull(user))
{
log.info("登录用户:{} 不存在.", username);
@ -57,4 +68,6 @@ public class UserDetailsServiceImpl implements UserDetailsService
{
return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
}
}

@ -0,0 +1,48 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
/**
*
*
*/
//"地址对象")
@Data
@TableName("address")
public class Address {
private static final long serialVersionUID = 1L;
//"ID")
private Integer id;
//"地区邮编")
@Excel(name = "地区邮编")
private Long code;
//"父地区邮编")
@Excel(name = "父地区邮编")
private Long parentCode;
//"地区名")
@Excel(name = "地区名")
private String name;
//"地区层级")
@Excel(name = "地区层级")
private Integer level;
//"CREATED_AT")
@Excel(name = "CREATED_AT")
private String createdAt;
//"UPDATED_AT")
@Excel(name = "UPDATED_AT")
private String updatedAt;
//"DELETED_AT")
@Excel(name = "DELETED_AT")
private String deletedAt;
}

@ -0,0 +1,99 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import java.time.LocalDate;
import java.util.Date;
/**
* app yj_app_user
*
* @author
*/
//"会员信息对象")
@Data
@TableName("yj_app_user")
public class AppUser {
private static final long serialVersionUID = 1L;
//"ID")
@TableId(value = "app_user_id",type = IdType.AUTO)
private Long id;
//"昵称")
private String nickName;
//"名称")
private String userName;
//"密码")
private String password;
//"手机号")
private String phoneNumber;
//"帐号启用状态:0->禁用1->启用")
private Integer status;
//"头像")
private String avatar;
//"性别0->未知1->女2->男")
private Integer sex;
//"用户所在城市")
private String city;
//"用户所在省份")
private String province;
//"用户所在国家")
private String country;
//"生日")
@Excel(name = "生日", width = 30, dateFormat = "yyyy-MM-dd")
private LocalDate birthday;
//"设备id")
private String registerId;
//"访问/浏览门店id")
private Long visitStore;
//"小程序unionid")
private String unionid;
//"小程序openid")
private String openid;
/** 员工所属门店id */
private Long deptId;
/** 员工所属商户id */
private String tenantId;
/** 最后登录IP */
private String loginIp;
//个性签名140字
private String signature;
/** 最后登录时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date loginDate;
/**后台账户`sys_user`的user_id*/
@TableField("manage_account_id")
private Long manageAccountId;
@TableField(exist = false)
private String newPassword;
}

@ -0,0 +1,31 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**
*
*
*/
//"地址对象")
@Data
@TableName("mall_express")
public class Express extends BaseAudit {
private static final long serialVersionUID = 1L;
@TableId(type=IdType.ASSIGN_ID)
private Long id;
private String expressName;
private String expressCode;
private String status;
}

@ -0,0 +1,80 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author xn
* @since 2022-09-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("mall_member_address")
public class MemberAddress extends BaseAudit implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* id
*/
private Long userId;
/**
*
*/
//"收货人名称")
private String name;
/**
*
*/
//"是否默认")
private Boolean isDefault;
//"邮政编码")
private String postCode;
/**
*
*/
//"省")
private String province;
/**
*
*/
//"市")
private String city;
//"区")
private String district;
/**
*
*/
//"详细地址")
private String address;
/**
*
*/
//"电话")
private String phone;
}

@ -0,0 +1,34 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**
* oms_order_delivery_history
*
* @author
*/
//"订单发货记录对象")
@Data
@TableName("oms_order_delivery_history")
public class OrderDeliveryHistory extends BaseAudit {
private static final long serialVersionUID = 1L;
//"ID")
private Long id;
//"订单id")
@Excel(name = "订单id")
private Long orderId;
//"物流公司(配送方式)")
@Excel(name = "物流公司(配送方式)")
private String deliveryCompany;
//"物流单号")
@Excel(name = "物流单号")
private String deliverySn;
}

@ -0,0 +1,84 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
import java.math.BigDecimal;
/**
* oms_order_item
*
* @author /
*/
//"订单中所包含的商品对象")
@Data
@TableName("oms_order_item")
public class OrderItem extends BaseAudit {
private static final long serialVersionUID = 1L;
//"ID")
@TableId(type = IdType.ASSIGN_ID)
private Long id;
//"订单id")
@Excel(name = "订单id")
private Long orderId;
//"PRODUCT_ID")
@Excel(name = "PRODUCT_ID")
private Long productId;
//"商品编码")
@Excel(name = "商品编码")
private String outProductId;
//"商品sku id")
@Excel(name = "商品sku id")
private Long skuId;
//"sku编码")
@Excel(name = "sku编码")
private String outSkuId;
//"商品快照id")
@Excel(name = "商品快照id")
private Long productSnapshotId;
//"sku快照id")
@Excel(name = "sku快照id")
private Long skuSnapshotId;
//"展示图片")
@Excel(name = "展示图片")
private String pic;
//"PRODUCT_NAME")
@Excel(name = "PRODUCT_NAME")
private String productName;
//"销售价格")
@Excel(name = "销售价格")
private BigDecimal salePrice;
//"采购价")
@Excel(name = "采购价")
private BigDecimal purchasePrice;
//"购买数量")
@Excel(name = "购买数量")
private Integer quantity;
//"商品分类id")
@Excel(name = "商品分类id")
private Long productCategoryId;
//"商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
@Excel(name = "商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}]")
private String spData;
private Long storeId;
}

@ -0,0 +1,42 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**
* oms_order_operate_history
*
* @author zcc
*/
//"订单操作历史记录对象")
@Data
@TableName("oms_order_operate_history")
public class OrderOperateHistory extends BaseAudit {
private static final long serialVersionUID = 1L;
//"ID")
private Long id;
//"订单id")
@Excel(name = "订单id")
private Long orderId;
//"订单号")
@Excel(name = "订单号")
private String orderSn;
//"操作人:用户;系统;后台管理员")
@Excel(name = "操作人:用户;系统;后台管理员")
private String operateMan;
//"订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单")
@Excel(name = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单")
private Integer orderStatus;
//"备注")
@Excel(name = "备注")
private String note;
}

@ -1,5 +1,7 @@
package com.ruoyi.mall.domain;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
@ -88,6 +90,7 @@ public class Product extends BaseAudit {
// 0->商品1->课程
private Integer isCourse;
@TableField(updateStrategy= FieldStrategy.IGNORED)
private Long courseId;
/**
* id

@ -25,6 +25,7 @@ public class Sku extends BaseAudit {
private Long productId;
@Excel(name = "sku编码")
private String outSkuId;
@ -44,4 +45,5 @@ public class Sku extends BaseAudit {
@Excel(name = "库存数")
private Integer stock;
private String unit;
}

@ -0,0 +1,19 @@
package com.ruoyi.mall.domain.dto;
import lombok.Data;
import java.util.List;
/**
* DTO
*
* @author sjm
*/
@Data
public class AddressDTO {
private Long id;
private Long pid;
private String name;
private String level;
private List<AddressDTO> children;
}

@ -0,0 +1,22 @@
package com.ruoyi.mall.domain.form;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
//"商城售后订单处理操作请求体")
public class DealWithAftersaleForm {
//name = "orderId",value = "订单id",required = true,dataType = "Long")
@NotBlank(message = "订单id不能为空")
private Long orderId;
//name = "optType",value = "操作类型 1同意 2拒绝 3确认收货",required = true,dataType = "String")
@NotNull(message = "操作类型不能为空")
private Integer optType;
//name = "remark",value = "拒绝理由 操作类型为2时必填",required = true,dataType = "String")
private String remark;
}

@ -0,0 +1,40 @@
package com.ruoyi.mall.domain.form;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
//"商城订单请求体")
public class ManagerAftersaleOrderForm {
//name = "id", value = "售后单号", required = true, dataType = "Long")
private Long id;
//name = "orderSn", value = "订单号", required = true, dataType = "String")
private String orderSn;
//name = "userPhone", value = "用户名称(手机号)", required = true, dataType = "String")
private String userPhone;
//name = "status", value = "售后申请状态0->待处理1->退货中2->已完成3->已拒绝4->用户取消", required = true, dataType = "String")
private Integer status;
//name = "type", value = "售后类型1->退款2->退货退款", required = true, dataType = "String")
private Integer type;
//name = "startTime", value = "开始时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
//name = "endTime", value = "结束时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
private Long storeId;
}

@ -0,0 +1,27 @@
package com.ruoyi.mall.domain.query;
import com.ruoyi.common.annotation.Excel;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
@Getter
@Setter
public class DeliverProductForm {
//"订单id")
@NotBlank(message = "订单id不能为空")
@Excel(name = "订单号")
private Long orderId;
//"快递名称")
@NotBlank(message = "快递名称不能为空")
@Excel(name = "快递公司")
private String expressName;
//"快递单号")
@NotBlank(message = "快递单号不能为空")
@Excel(name = "运单号")
private String expressSn;
}

@ -0,0 +1,54 @@
package com.ruoyi.mall.domain.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
//"后台订单查询请求体")
public class ManagerOrderQueryForm {
//name = "orderId", value = "订单id", required = true, dataType = "Long")
private Long orderId;
//name = "orderSn", value = "订单编号", required = true, dataType = "String")
private String orderSn;
//name = "productId", value = "商品id", required = true, dataType = "Long")
private Long productId;
//name = "productName", value = "商品名称", required = true, dataType = "String")
private String productName;
//name = "userPhone", value = "用户名称(手机号)", required = true, dataType = "String")
private String userPhone;
//name = "payType", value = "支付方式 0->未支付1->支付宝2->微信", required = true, dataType = "Integer")
private Integer payType;
//name = "status", value = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单", required = true, dataType = "String")
private Integer status;
//"省份/直辖市 精确匹配")
private String receiverProvince;
//"城市 精确匹配")
private String receiverCity;
//"区 精确匹配")
private String receiverDistrict;
//name = "startTime", value = "开始时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
//name = "endTime", value = "结束时间", required = true, dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
private Long storeId;
}

@ -0,0 +1,57 @@
package com.ruoyi.mall.domain.query;
import lombok.Data;
import java.math.BigDecimal;
/**
*
*
* @author zcc
*/
//"订单中所包含的商品 查询 对象")
@Data
public class OrderItemQuery {
//"订单id 精确匹配")
private Long orderId;
//"PRODUCT_ID 精确匹配")
private Long productId;
//"商品编码 精确匹配")
private String outProductId;
//"商品sku id 精确匹配")
private Long skuId;
//"sku编码 精确匹配")
private String outSkuId;
//"商品快照id 精确匹配")
private Long productSnapshotId;
//"sku快照id 精确匹配")
private Long skuSnapshotId;
//"展示图片 精确匹配")
private String pic;
//"PRODUCT_NAME 精确匹配")
private String productNameLike;
//"销售价格 精确匹配")
private BigDecimal salePrice;
//"采购价 精确匹配")
private BigDecimal purchasePrice;
//"购买数量 精确匹配")
private Integer quantity;
//"商品分类id 精确匹配")
private Long productCategoryId;
//"商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配")
private String spData;
}

@ -15,6 +15,8 @@ public class SkuQuery {
//"PRODUCT_ID 精确匹配")
private Long productId;
private String outProductId;
//"sku编码 精确匹配")
private String outSkuId;

@ -0,0 +1,24 @@
package com.ruoyi.mall.domain.vo;
import lombok.Getter;
import lombok.Setter;
/**
* @author: Jinxin
* @date: 2022/4/22 14:12
* @Description:
*/
@Getter
@Setter
//"订单收获地址")
public class ManagerOrderAddressVo {
//"收货人姓名")
private String name;
//"收货人手机号")
private String userPhone;
//"收获区域")
private String area;
//"详细地址")
private String address;
}

@ -0,0 +1,45 @@
package com.ruoyi.mall.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
//"后台订单详情对象")
public class ManagerOrderDetailVO {
//"订单id")
private Long orderId;
//"订单编号")
private String orderSn;
//"用户昵称")
private String userName;
//"用户手机号")
private String userPhone;
//"下单时间")
private LocalDateTime createTime;
//"支付方式0->未支付1->支付宝2->微信")
private Integer payType;
//"支付时间")
private LocalDateTime payTime;
//"订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单")
private Integer orderStatus;
//"订单收获地址信息")
private ManagerOrderAddressVo addressInfo;
//"订单商品信息")
private List<ManagerOrderProductVO> productInfo;
//"发货时间")
private LocalDateTime deliveryTime;
//"收货时间")
private LocalDateTime receiveTime;
//"物流单号")
private String expressNo;
//"物流名称")
private String expressName;
//"支付金额")
private BigDecimal payAmount;
//"订单金额")
private BigDecimal totalAmount;
private BigDecimal couponAmount;
}

@ -0,0 +1,23 @@
package com.ruoyi.mall.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
//"订单")
public class ManagerOrderProductVO {
//"商品id")
private Long productId;
//"商品名称")
private String productName;
//"商品规格")
private String spData;
//"商品图片")
private String pic;
//"购买数量")
private Integer buyNum;
//"销售价格")
private BigDecimal salePrice;
}

@ -0,0 +1,102 @@
package com.ruoyi.mall.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
// "管理后台订单VO")
public class ManagerOrderVO {
//name = "id",value = "订单id",required = true,dataType = "Long")
private Long id;
//name = "orderSn",value = "订单编号",required = true,dataType = "String")
private String orderSn;
//name = "productId",value = "商品id",required = true,dataType = "Long")
private Long productId;
//name = "productName",value = "商品名称",required = true,dataType = "String")
private String productName;
//name = "userPhone",value = "用户账号",required = true,dataType = "String")
private String userPhone;
//name = "nickName",value = "用户昵称",required = true,dataType = "String")
private String nickName;
//name = "avatar",value = "用户头像",required = true,dataType = "String")
private String avatar;
//name = "status",value = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单",required = true,dataType = "Integer")
private Integer status;
//"退款状态枚举值1无售后或售后关闭2售后处理中3退款中4 退款成功")
private Integer aftersaleStatus;
//name = "pic",value = "商品图片",required = true,dataType = "String")
private String pic;
//name = "userName",value = "用户名称",required = true,dataType = "String")
private String userName;
//name = "buyNum",value = "购买数量",required = true,dataType = "Integer")
private Integer buyNum;
//name = "totalAmount",value = "订单总金额",required = true,dataType = "BigDecimal")
private BigDecimal totalAmount;
//name = "payAmount",value = "应付金额",required = true,dataType = "BigDecimal")
private BigDecimal payAmount;
//name = "createTime",value = "下单时间",required = true,dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
//name = "payTime",value = "支付时间",required = true,dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime payTime;
//name = "payType",value = "支付方式 支付方式0->未支付1->支付宝2->微信",required = true,dataType = "Integer")
private Integer payType;
//name = "receiveTime",value = "确认收货时间",required = true,dataType = "Date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime receiveTime;
//name = "note",value = "备注",required = true,dataType = "String")
private String note;
//"商家备注")
private String merchantNote;
//name = "spData",value = "商品sku属性",required = true,dataType = "String")
private String spData;
//name = "productInfo", value = "订单商品数据")
private List<ManagerOrderProductVO> productList;
//name = "deliveryTime",value = "发货时间",required = true,dataType = "LocalDataTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime deliveryTime;
//name = "deliverySn",value = "物流单号",required = true,dataType = "String")
private String deliverySn;
private String receiverName;
private String receiverPhone;
private String receiverProvince;
private String receiverCity;
private String receiverDistrict;
private String receiverDetailAddress;
private String mark;
private BigDecimal couponAmount;
}

@ -0,0 +1,50 @@
package com.ruoyi.mall.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author:
* @date: 2022/4/22 14:12
* @Description:
*/
@Data
//"售后订单详情")
public class ManagerRefundOrderDetailVO {
//"订单id")
private Long orderId;
//"订单号")
private String orderSn;
//"用户昵称")
private String nickName;
//"用户手机号")
private String phone;
//"下单时间")
private LocalDateTime createTime;
//"支付方式0->未支付1->支付宝2->微信")
private Integer payType;
//"支付时间")
private LocalDateTime payTime;
//"订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单")
private Integer status;
//"订单收获地址信息")
private OrderAddressVO addressInfo;
//"订单商品信息")
private List<ManagerOrderProductVO> productList;
//"售后信息")
private List<RefundInfoVO> refundInfoList;
//"退货时间")
private LocalDateTime deliveryTime;
//"物流单号")
private String expressNo;
//"物流名称")
private String expressName;
//"订单总金额")
private BigDecimal totalAmount;
//"应付金额(实际支付金额)")
private BigDecimal payAmount;
}

@ -0,0 +1,84 @@
package com.ruoyi.mall.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
// "售后订单vo")
public class ManagerRefundOrderVO {
//name = "id",value = "售后单id",required = true,dataType = "Long")
private Long id;
//name = "orderId",value = "订单id",required = true,dataType = "Long")
private Long orderId;
//name = "orderSn",value = "订单号",required = true,dataType = "String")
private String orderSn;
//name = "payId",value = "支付ID",required = true,dataType = "Long")
private Long payId;
//name = "phone",value = "用户手机号",required = true,dataType = "String")
private String phone;
//name = "nickName",value = "用户昵称",required = true,dataType = "String")
private String nickName;
//name = "status",value = "订单状态 0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单",required = true,dataType = "Integer")
private Integer status;
//name = "userName",value = "用户名称",required = true,dataType = "String")
private String userName;
//name = "payTime",value = "支付时间",required = true,dataType = "String")
private String payTime;
//name = "payType",value = "支付方式 支付方式0->未支付1->支付宝2->微信",required = true,dataType = "Integer")
private Integer payType;
//name = "applyRefundTime",value = "申请售后的时间",required = true,dataType = "String")
private String applyRefundTime;
//name = "refundFinishTime",value = "售后完成的时间",required = true,dataType = "String")
private String refundFinishTime;
//name = "aftersaleStatus",value = "0->待处理1->退货中2->已完成3->已拒绝; 4->用户取消",required = true,dataType = "String")
private Integer aftersaleStatus;
//name = "note",value = "备注",required = true,dataType = "String")
private String note;
//name = "applyRefundAmount",value = "退款金额",required = true,dataType = "BigDecimal")
private BigDecimal applyReturnAmount;
//name = "refundNum",value = "退款数量",required = true,dataType = "Integer")
private Integer refundNum;
//name = "applyRefundType",value = "申请退货方式1-仅退款2-退货退款",required = true,dataType = "String")
private Integer applyRefundType;
//name = "handleTime",value = "处理时间",required = true,dataType = "LocalDateTime")
private LocalDateTime handleTime;
//name = "reason",value = "原因",required = true,dataType = "String")
private String reason;
//name = "description",value = "描述",required = true,dataType = "String")
private String description;
//name = "proofPics",value = "凭证图片",required = true,dataType = "String")
private String proofPics;
//name = "productInfo", value = "售后单商品数据")
private List<ManagerOrderProductVO> productList;
//name = "handleMan", value = "处理人员")
private String handleMan;
private String mark;
private String refundWpCode;
//"退货快递号")
private String refundWaybillCode;
}

@ -0,0 +1,24 @@
package com.ruoyi.mall.domain.vo;
import lombok.Getter;
import lombok.Setter;
/**
* @author:
* @date: 2022/4/22 14:12
* @Description:
*/
@Getter
@Setter
//"订单收获地址")
public class OrderAddressVO {
//"收货人姓名")
private String name;
//"收货人手机号")
private String userPhone;
//"收获区域")
private String area;
//"详细地址")
private String address;
}

@ -0,0 +1,31 @@
package com.ruoyi.mall.domain.vo;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**
*
*
* @author zcc
*/
@Data
public class OrderOperateHistoryVO extends BaseAudit {
/** ID */
private Long id;
/** 订单id */
@Excel(name = "订单id")
private Long orderId;
/** 订单号 */
@Excel(name = "订单号")
private String orderSn;
/** 操作人:用户;系统;后台管理员 */
@Excel(name = "操作人:用户;系统;后台管理员")
private String operateMan;
/** 订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单 */
@Excel(name = "订单状态0->待付款1->待发货2->已发货3->已完成4->已关闭5->无效订单")
private Integer orderStatus;
/** 备注 */
@Excel(name = "备注")
private String note;
}

@ -63,5 +63,11 @@ public class ProductVO extends BaseAudit {
private String productCategoryName;
@Excel(name = "商品销售属性json格式")
private String productAttr;
// 0->商品1->课程
private Integer isCourse;
private Long courseId;
private String courseName;
private List<Sku> skuList;
}

@ -0,0 +1,48 @@
package com.ruoyi.mall.domain.vo;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* @author: Jinxin
* @date: 2022/4/22 14:12
* @Description:
*/
@Getter
@Setter
//"售后信息")
public class RefundInfoVO {
//"退款单号")
private Long id;
//"申请退货方式1-仅退款2-退货退款")
private Integer applyRefundType;
//"申请售后时间")
private LocalDateTime applyRefundTime;
//"售后金额")
private BigDecimal refundAmount;
//"申请原因")
private String reason;
//"描述")
private String description;
//"凭证")
private String proofPics;
//"申请状态0->待处理1->退货中2->已完成3->已拒绝; 4->用户取消")
private Integer refundStatus;
//"平台拒绝理由")
private String remark;
//"物流单号")
private String expressNo;
//"物流名称")
private String expressName;
//"最新物流数据")
private String logistics;
//"所有物流信息 JSON格式")
private String allLogistics;
private String refundWpCode;
//"退货快递号")
private String refundWaybillCode;
}

@ -0,0 +1,21 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.Address;
import java.util.List;
/**
* Mapper
*
* @author sjm
*/
public interface AddressMapper extends BaseMapper<Address> {
/**
*
*
* @param address
* @return
*/
List<Address> selectByEntity(Address address);
}

@ -2,10 +2,17 @@ package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.Aftersale;
import com.ruoyi.mall.domain.form.ManagerAftersaleOrderForm;
import com.ruoyi.mall.domain.vo.ManagerRefundOrderVO;
import com.ruoyi.mall.domain.vo.OrderAndAftersaleStatisticsVO;
import java.util.List;
public interface AftersaleMapper extends BaseMapper<Aftersale> {
OrderAndAftersaleStatisticsVO statPendingAndProcessing();
List<ManagerRefundOrderVO> selectManagerRefundOrder(ManagerAftersaleOrderForm managerAftersaleOrderPageRequest);
}

@ -0,0 +1,14 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.Express;
/**
* Mapper
*
* @author
*/
public interface ExpressMapper extends BaseMapper<Express> {
}

@ -0,0 +1,25 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.MemberAddress;
import java.util.List;
/**
* Mapper
*
* @author zcc
*/
public interface MemberAddressMapper extends BaseMapper<MemberAddress> {
/**
*
*
* @param memberAddress
* @return
*/
List<MemberAddress> selectByEntity(MemberAddress memberAddress);
int updateByPrimaryKeySelective(MemberAddress address);
void updateDefault(int IsDefault, Long id);
}

@ -0,0 +1,21 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.OrderDeliveryHistory;
import java.util.List;
/**
* Mapper
*
* @author zcc
*/
public interface OrderDeliveryHistoryMapper extends BaseMapper<OrderDeliveryHistory> {
/**
*
*
* @param orderDeliveryHistory
* @return
*/
List<OrderDeliveryHistory> selectByEntity(OrderDeliveryHistory orderDeliveryHistory);
}

@ -0,0 +1,21 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.OrderItem;
import java.util.List;
/**
* Mapper
*
* @author zcc
*/
public interface OrderItemMapper extends BaseMapper<OrderItem> {
/**
*
*
* @param orderItem
* @return
*/
List<OrderItem> selectByEntity(OrderItem orderItem);
}

@ -2,15 +2,27 @@ package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.Order;
import com.ruoyi.mall.domain.query.ManagerOrderQueryForm;
import com.ruoyi.mall.domain.vo.ManagerOrderVO;
import com.ruoyi.mall.domain.vo.OrderAndAftersaleStatisticsVO;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
public interface OrderMapper extends BaseMapper<Order> {
Integer statWaitDelivered();
OrderAndAftersaleStatisticsVO statTodayData(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
/**
*
*
* @param order
* @return
*/
List<Order> selectByEntity(Order order);
List<ManagerOrderVO> selectManagerOrderPage(ManagerOrderQueryForm request);
}

@ -0,0 +1,21 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.OrderOperateHistory;
import java.util.List;
/**
* Mapper
*
* @author zcc
*/
public interface OrderOperateHistoryMapper extends BaseMapper<OrderOperateHistory> {
/**
*
*
* @param orderOperateHistory
* @return
*/
List<OrderOperateHistory> selectByEntity(OrderOperateHistory orderOperateHistory);
}

@ -0,0 +1,18 @@
package com.ruoyi.mall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.mall.domain.AppUser;
/**
* <p>
* Mapper
* </p>
*
* @author xn
* @since 2022-10-14
*/
public interface YjAppUserMapper extends BaseMapper<AppUser> {
}

@ -0,0 +1,463 @@
package com.ruoyi.mall.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.AftersaleStatus;
import com.ruoyi.common.enums.OrderRefundStatus;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.mall.domain.*;
import com.ruoyi.mall.domain.form.DealWithAftersaleForm;
import com.ruoyi.mall.domain.form.ManagerAftersaleOrderForm;
import com.ruoyi.mall.domain.vo.*;
import com.ruoyi.mall.mapper.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
*
* @author zcc
*/
@Service
@Slf4j
public class AftersaleService {
@Autowired
private AftersaleMapper aftersaleMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderOperateHistoryMapper orderOperateHistoryMapper;
@Autowired
private YjAppUserMapper appUserMapper;
@Autowired
private SkuMapper skuMapper;
// @Autowired
// private WechatPaymentHistoryMapper wechatPaymentHistoryMapper;
// @Autowired
// private MemberWechatMapper memberWechatMapper;
// @Autowired(required = false)
// private WechatPayService wechatPayService;
@Autowired
private OrderOperateHistoryMapper operateHistoryMapper;
/**
*
*
* @param id
* @return
*/
public ManagerRefundOrderDetailVO selectById(Long id) {
Order order = orderMapper.selectById(id);
if (order == null) {
throw new RuntimeException("无该订单信息");
}
ManagerRefundOrderDetailVO result = new ManagerRefundOrderDetailVO();
//订单基本信息
result.setOrderId(order.getId());
result.setOrderSn(order.getOrderSn());
result.setCreateTime(order.getCreateTime());
result.setPayType(order.getPayType());
result.setPayTime(order.getPaymentTime());
result.setStatus(order.getStatus());
result.setExpressName(order.getDeliveryCompany());
result.setDeliveryTime(order.getDeliveryTime());
result.setExpressNo(order.getDeliverySn());
result.setTotalAmount(order.getTotalAmount());
result.setPayAmount(order.getPayAmount());
//用户信息
AppUser member = appUserMapper.selectById(order.getMemberId());
result.setNickName(member.getNickName());
result.setPhone(member.getPhoneNumber());
//收货信息
OrderAddressVO orderAddressVO = new OrderAddressVO();
orderAddressVO.setAddress(order.getReceiverDetailAddress());
orderAddressVO.setName(order.getReceiverName());
orderAddressVO.setUserPhone(order.getReceiverPhone());
orderAddressVO.setArea(order.getReceiverProvince() + order.getReceiverCity() + order.getReceiverDistrict());
result.setAddressInfo(orderAddressVO);
//orderItem
QueryWrapper<OrderItem> orderItemQw = new QueryWrapper<>();
orderItemQw.eq("order_id", id);
orderItemQw.eq("store_id", SecurityUtils.getDeptId());
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemQw);
List<ManagerOrderProductVO> productList = new ArrayList<>();
orderItemList.forEach(orderItem -> {
ManagerOrderProductVO productVO = new ManagerOrderProductVO();
productVO.setPic(orderItem.getPic());
productVO.setSpData(orderItem.getSpData());
productVO.setProductName(orderItem.getProductName());
productVO.setSalePrice(orderItem.getSalePrice());
productVO.setBuyNum(orderItem.getQuantity());
productVO.setProductId(orderItem.getProductId());
productList.add(productVO);
});
result.setProductList(productList);
//售后信息
QueryWrapper<Aftersale> aftersaleQw = new QueryWrapper<>();
aftersaleQw.eq("order_id", order.getId());
aftersaleQw.orderByDesc("create_time");
List<Aftersale> aftersaleList = aftersaleMapper.selectList(aftersaleQw);
List<RefundInfoVO> refundInfoList = new ArrayList<>();
aftersaleList.forEach(aftersale -> {
RefundInfoVO refundInfo = new RefundInfoVO();
refundInfo.setId(aftersale.getId());
refundInfo.setApplyRefundType(aftersale.getType());
refundInfo.setApplyRefundTime(aftersale.getCreateTime());
refundInfo.setRefundAmount(aftersale.getReturnAmount());
refundInfo.setReason(aftersale.getReason());
refundInfo.setDescription(aftersale.getDescription());
refundInfo.setProofPics(aftersale.getProofPics());
refundInfo.setRefundStatus(aftersale.getStatus());
refundInfo.setRefundWpCode(aftersale.getRefundWpCode());
refundInfo.setRefundWaybillCode(aftersale.getRefundWaybillCode());
refundInfo.setRefundStatus(aftersale.getStatus());
refundInfo.setRemark(aftersale.getHandleNote());
refundInfoList.add(refundInfo);
});
result.setRefundInfoList(refundInfoList);
return result;
}
/**
*
*
* @param query
* @param page
* @return
*/
public List<ManagerRefundOrderVO> selectList(ManagerAftersaleOrderForm query, Pageable page) {
if (page != null) {
PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize());
}
if (StrUtil.isNotBlank(query.getOrderSn()) && query.getOrderSn().length() > 7) {
query.setOrderSn(query.getOrderSn().substring(7));
}
query.setStoreId(SecurityUtils.getDeptId());
List<ManagerRefundOrderVO> managerRefundOrderVOS = aftersaleMapper.selectManagerRefundOrder(query);
if (CollectionUtil.isEmpty(managerRefundOrderVOS)) {
return managerRefundOrderVOS;
}
Set<Long> idSet = managerRefundOrderVOS.stream().map(ManagerRefundOrderVO::getOrderId).collect(Collectors.toSet());
//查一下orderSn集合
QueryWrapper<Order> orderQw = new QueryWrapper<>();
orderQw.in("id", idSet);
Map<Long, Order> orderMap = orderMapper.selectList(orderQw).stream().collect(Collectors.toMap(Order::getId, it -> it));
//封装售后单商品数据
QueryWrapper<OrderItem> orderItemQw = new QueryWrapper<>();
orderItemQw.in("order_id", idSet);
orderItemQw.eq("store_id",SecurityUtils.getDeptId());
Map<Long, List<OrderItem>> orderItemMap = orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId));
managerRefundOrderVOS.forEach(vo -> {
Order order = orderMap.get(vo.getOrderId());
vo.setOrderSn(order.getOrderSn());
List<OrderItem> orderItemList = orderItemMap.get(vo.getOrderId());
List<ManagerOrderProductVO> productList = new ArrayList<>();
orderItemList.forEach(item -> {
ManagerOrderProductVO productVO = new ManagerOrderProductVO();
productVO.setProductName(item.getProductName());
productVO.setSalePrice(item.getSalePrice());
productVO.setPic(item.getPic());
productVO.setBuyNum(item.getQuantity());
productVO.setProductId(item.getProductId());
productVO.setSpData(item.getSpData());
productList.add(productVO);
});
vo.setProductList(productList);
});
return managerRefundOrderVOS;
}
/**
*
*
* @param aftersale
* @return
*/
public int insert(Aftersale aftersale) {
aftersale.setCreateTime(LocalDateTime.now());
return aftersaleMapper.insert(aftersale);
}
/**
*
*
* @param aftersale
* @return
*/
public int update(Aftersale aftersale) {
return aftersaleMapper.updateById(aftersale);
}
/**
*
*
* @param id
* @return
*/
public int deleteById(Long id) {
return aftersaleMapper.deleteById(id);
}
/**
*
*
* @param request
* @param user
* @return
*/
@Transactional(rollbackFor = Exception.class)
public void dealWith(DealWithAftersaleForm request, Long userId, String optUserName) {
Order order = orderMapper.selectById(request.getOrderId());
if (order == null) {
throw new RuntimeException("无该订单");
}
QueryWrapper<Aftersale> aftersaleQw = new QueryWrapper<>();
aftersaleQw.eq("order_id", request.getOrderId());
if (request.getOptType() == 3) {
aftersaleQw.eq("status", 1);
} else {
aftersaleQw.eq("status", 0);
}
Aftersale aftersale = aftersaleMapper.selectOne(aftersaleQw);
if (aftersale == null) {
throw new RuntimeException("没有售后单");
}
//售后状态与售后类型是否对应
if (Constants.OptType.AGREE.equals(request.getOptType()) || Constants.OptType.REFUSE.equals(request.getOptType())) {
if (!AftersaleStatus.APPLY.getType().equals(aftersale.getStatus())) {
throw new RuntimeException("订单状态错误,请刷新页面后重试!");
}
} else {
if (!AftersaleStatus.WAIT.getType().equals(aftersale.getStatus())) {
throw new RuntimeException("订单状态错误,请刷新页面后重试!");
}
}
//拒绝则理由必填
if (Constants.OptType.REFUSE.equals(request.getOptType()) && StrUtil.isBlank(request.getRemark())) {
throw new RuntimeException("请填写拒绝理由");
}
LocalDateTime optDate = LocalDateTime.now();
//要创建的订单操作记录status后续判断再设置
OrderOperateHistory optHistory = new OrderOperateHistory();
optHistory.setOrderId(order.getId());
optHistory.setOrderSn(order.getOrderSn());
optHistory.setOperateMan("后台管理员");
optHistory.setCreateTime(optDate);
optHistory.setCreateBy(userId);
optHistory.setUpdateBy(userId);
optHistory.setUpdateTime(optDate);
//封装售后wrapper
UpdateWrapper<Aftersale> aftersaleWrapper = new UpdateWrapper<>();
aftersaleWrapper.eq("order_id", request.getOrderId());
aftersaleWrapper.eq("status", AftersaleStatus.APPLY.getType());
aftersaleWrapper.set("handle_man", optUserName);
aftersaleWrapper.set("update_time", optDate);
aftersaleWrapper.set("handle_time", optDate);
aftersaleWrapper.set("update_by", userId);
//封装订单wrapper
UpdateWrapper<Order> orderWrapper = new UpdateWrapper<>();
orderWrapper.eq("id", request.getOrderId());
orderWrapper.set("update_time", optDate);
orderWrapper.set("update_by", userId);
//更新订单、售后单,创建操作记录
if (request.getOptType().equals(Constants.OptType.REFUSE)) {
aftersaleWrapper.set("status", AftersaleStatus.REJECT.getType());
aftersaleWrapper.set("handle_note", request.getRemark());
orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType());
optHistory.setOrderStatus(14);
} else if (request.getOptType().equals(Constants.OptType.AGREE)) {
aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType());
orderWrapper.set("aftersale_status", Objects.equals(aftersale.getType(), 1) ? 3 : 2);
optHistory.setOrderStatus(12);
} else {
//如果是退货退款 order身上的售后状态应该是保持不变的 仅退款的话就进入退款了
orderWrapper.set("aftersale_status", 3);
int row = orderMapper.update(null, orderWrapper);
if (row != 1) {
throw new RuntimeException("修改订单状态失败");
}
}
int rows = aftersaleMapper.update(null, aftersaleWrapper);
// if (rows < 1) {
// throw new RuntimeException("更新售后单失败");
// }
rows = orderMapper.update(null, orderWrapper);
if (rows < 1) {
throw new RuntimeException("更新订单失败");
}
rows = orderOperateHistoryMapper.insert(optHistory);
if (rows < 1) {
throw new RuntimeException("创建订单操作记录失败");
}
// 是否需要发起退款
if ((request.getOptType() == Constants.OptType.GIVING || (request.getOptType() == Constants.OptType.AGREE && aftersale.getType() == 1))) {
// tradeRefund(aftersale, order, optDate, userId);
}
}
/**
public void tradeRefund(Aftersale returnApply, Order order, LocalDateTime optDate, Long userId) {
//查一下微信订单
QueryWrapper<WechatPaymentHistory> qw = new QueryWrapper<>();
qw.eq("order_id", order.getPayId()).eq("op_type", 1);
WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw);
//查用户的微信信息
QueryWrapper<MemberWechat> wechatQw = new QueryWrapper<>();
wechatQw.eq("member_id", order.getMemberId());
MemberWechat memberWechat = memberWechatMapper.selectOne(wechatQw);
//查订单item
QueryWrapper<OrderItem> itemQw = new QueryWrapper<>();
itemQw.eq("order_id", order.getId());
OrderItem orderItem = orderItemMapper.selectList(itemQw).get(0);
//开始退款
Refund wechatResponse = wechatPayService.refundPay(returnApply.getId() + "",
order.getPayId() + "",
"https://mall.ichengle.top/api/no-auth/wechat/weChatRefundNotify",
returnApply.getReturnAmount().multiply(new BigDecimal("100")).longValue(),
history.getMoney().multiply(new BigDecimal("100")).longValue(), returnApply.getReason());
log.info("发起微信退款返回信息,tradeRefund:{}", JSONObject.toJSONString(wechatResponse == null ? "" : wechatResponse));
if (wechatResponse != null && Arrays.asList("PROCESSING", "SUCCESS").contains(wechatResponse.getStatus().name())) {
qw = new QueryWrapper<>();
qw.eq("order_id", order.getId()).eq("op_type", 3);
WechatPaymentHistory refundHistory = wechatPaymentHistoryMapper.selectOne(qw);
if (refundHistory == null) {
WechatPaymentHistory wechatPaymentHistory = new WechatPaymentHistory();
wechatPaymentHistory.setPaymentId(wechatResponse.getRefundId());
wechatPaymentHistory.setMemberId(order.getMemberId());
LambdaQueryWrapper<WechatPaymentHistory> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(WechatPaymentHistory::getOrderId, order.getPayId());
queryWrapper.eq(WechatPaymentHistory::getOpType, Constants.PaymentOpType.PAY);
WechatPaymentHistory payHistory = wechatPaymentHistoryMapper.selectOne(queryWrapper);
wechatPaymentHistory.setOpenid(payHistory.getOpenid());
wechatPaymentHistory.setTitle(orderItem.getProductName());
wechatPaymentHistory.setOrderId(order.getId());
wechatPaymentHistory.setMoney(returnApply.getReturnAmount().multiply(new BigDecimal("100")));
wechatPaymentHistory.setOpType(3);
wechatPaymentHistory.setPaymentStatus(0);
wechatPaymentHistory.setResponseBody(JSON.toJSONString(wechatResponse));
wechatPaymentHistory.setCreateTime(optDate);
wechatPaymentHistory.setUpdateTime(optDate);
wechatPaymentHistory.setCreateBy(userId);
wechatPaymentHistory.setUpdateBy(userId);
wechatPaymentHistoryMapper.insert(wechatPaymentHistory);
} else {
UpdateWrapper<WechatPaymentHistory> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", refundHistory.getId())
.set("payment_id", wechatResponse.getRefundId()).set("update_time", optDate);
wechatPaymentHistoryMapper.update(null, updateWrapper);
}
}
}
**/
/**
* 退MQ
*
* @param weChatRefundNotify
*/
/**
@Transactional
public void refundOrderExc(RefundNotification weChatRefundNotify) {
log.info("收到订单回调MQ" + JSONObject.toJSONString(weChatRefundNotify));
if ("PROCESSING".equals(weChatRefundNotify.getRefundStatus().name())) {
return;
}
//查一下微信订单
QueryWrapper<WechatPaymentHistory> qw = new QueryWrapper<>();
qw.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3);
WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw);
if (history == null) {
log.info("未找到退款单");
throw new RuntimeException();
}
LocalDateTime optDate = LocalDateTime.now();
QueryWrapper<Order> orderQw = new QueryWrapper<>();
orderQw.eq("id", history.getOrderId());
Order order = orderMapper.selectOne(orderQw);
if (order.getStatus() == OrderRefundStatus.SUCCESS.getType()) {
log.info("订单已经是退款成功状态");
throw new RuntimeException();
}
QueryWrapper<Aftersale> aftersaleQw = new QueryWrapper<>();
aftersaleQw.eq("order_id", history.getOrderId()).eq("status", AftersaleStatus.WAIT.getType());
if ("SUCCESS".equals(weChatRefundNotify.getRefundStatus().name())) {
//更改订单表
UpdateWrapper<Order> orderUpdateWrapper = new UpdateWrapper<>();
orderUpdateWrapper.eq("id", history.getOrderId())
.set("aftersale_status", OrderRefundStatus.SUCCESS.getType());
orderMapper.update(null, orderUpdateWrapper);
//更改 售后表
UpdateWrapper<Aftersale> aftersaleWrapper = new UpdateWrapper<>();
aftersaleWrapper.eq("order_id", history.getOrderId()).set("status", AftersaleStatus.SUCCESS.getType());
aftersaleMapper.update(null, aftersaleWrapper);
//更改 微信表
UpdateWrapper<WechatPaymentHistory> paymentWrapper = new UpdateWrapper<>();
paymentWrapper.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3)
.set("payment_status", 1);
wechatPaymentHistoryMapper.update(null, paymentWrapper);
OrderOperateHistory optHistory = new OrderOperateHistory();
optHistory.setOrderId(order.getId());
optHistory.setOperateMan("系统");
optHistory.setCreateTime(optDate);
optHistory.setCreateBy(order.getMemberId());
optHistory.setUpdateBy(order.getMemberId());
optHistory.setUpdateTime(optDate);
optHistory.setOrderStatus(13);
operateHistoryMapper.insert(optHistory);
// 回滚商品和sku销量
OrderItem orderItem = orderItemMapper.selectOne(new QueryWrapper<OrderItem>().eq("order_id", order.getId()));
skuMapper.updateStockById(orderItem.getSkuId(), LocalDateTime.now(), -1 * orderItem.getQuantity());
//退还优惠券
if (order.getMemberCouponId() != null) {
memberCouponService.backCoupon(Arrays.asList(order.getMemberCouponId()));
}
} else {
//更改订单表
UpdateWrapper<Order> orderUpdateWrapper = new UpdateWrapper<>();
orderUpdateWrapper.eq("id", history.getOrderId())
.set("aftersale_status", OrderRefundStatus.FAIL.getType());
orderMapper.update(null, orderUpdateWrapper);
}
}
**/
public List<OrderOperateHistoryVO> log(Long orderId) {
LambdaQueryWrapper<OrderOperateHistory> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderOperateHistory::getOrderId, orderId);
wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(11, 12, 13, 14));
wrapper.orderByDesc(OrderOperateHistory::getCreateTime);
List<OrderOperateHistory> historyList = orderOperateHistoryMapper.selectList(wrapper);
return BeanUtil.copyToList(historyList,OrderOperateHistoryVO.class);
}
public Aftersale queryAfterSale(Long orderId) {
QueryWrapper<Aftersale> itemQw = new QueryWrapper<>();
itemQw.eq("order_id",orderId);
itemQw.in("status",Arrays.asList(AftersaleStatus.APPLY.getType(),AftersaleStatus.WAIT.getType()));
return aftersaleMapper.selectOne(itemQw);
}
}

@ -0,0 +1,90 @@
package com.ruoyi.mall.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.ruoyi.mall.domain.Express;
import com.ruoyi.mall.mapper.ExpressMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
/**
* Service
*
*
* @author zcc
*/
@Service
public class ExpressService {
@Autowired
private ExpressMapper mapper;
/**
*
*
* @param id
* @return
*/
public Express selectById(Long id) {
return mapper.selectById(id);
}
/**
*
*
* @param query
* @param page
* @return
*/
public List<Express> selectList(Express query, Pageable page) {
if (page != null) {
PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize());
}
QueryWrapper<Express> qw = new QueryWrapper<>();
String nameLike = query.getExpressName();
if (!StringUtils.isEmpty(nameLike)) {
qw.like("express_name", "%".concat(nameLike).concat("%"));
}
String status = query.getStatus();
if (status != null) {
qw.eq("status", status);
}
return mapper.selectList(qw);
}
/**
*
*
* @param
* @return
*/
public int insert(Express express) {
express.setCreateTime(LocalDateTime.now());
return mapper.insert(express);
}
/**
*
*
* @param express
* @return
*/
public int update(Express express) {
return mapper.updateById(express);
}
/**
*
*
* @param id
* @return
*/
public int deleteById(Long id) {
return mapper.deleteById(id);
}
}

@ -0,0 +1,142 @@
package com.ruoyi.mall.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.ruoyi.mall.domain.OrderItem;
import com.ruoyi.mall.domain.query.OrderItemQuery;
import com.ruoyi.mall.mapper.OrderItemMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* Service
*
*
* @author zcc
*/
@Service
public class OrderItemService extends ServiceImpl<OrderItemMapper, OrderItem> {
@Autowired
private OrderItemMapper orderItemMapper;
/**
*
*
* @param id
* @return
*/
public OrderItem selectById(Long id) {
return orderItemMapper.selectById(id);
}
/**
*
*
* @param query
* @param page
* @return
*/
public List<OrderItem> selectList(OrderItemQuery query, Pageable page) {
if (page != null) {
PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize());
}
QueryWrapper<OrderItem> qw = new QueryWrapper<>();
Long orderId = query.getOrderId();
if (orderId != null) {
qw.eq("order_id", orderId);
}
Long productId = query.getProductId();
if (productId != null) {
qw.eq("product_id", productId);
}
String outProductId = query.getOutProductId();
if (!StringUtils.isEmpty(outProductId)) {
qw.eq("out_product_id", outProductId);
}
Long skuId = query.getSkuId();
if (skuId != null) {
qw.eq("sku_id", skuId);
}
String outSkuId = query.getOutSkuId();
if (!StringUtils.isEmpty(outSkuId)) {
qw.eq("out_sku_id", outSkuId);
}
Long productSnapshotId = query.getProductSnapshotId();
if (productSnapshotId != null) {
qw.eq("product_snapshot_id", productSnapshotId);
}
Long skuSnapshotId = query.getSkuSnapshotId();
if (skuSnapshotId != null) {
qw.eq("sku_snapshot_id", skuSnapshotId);
}
String pic = query.getPic();
if (!StringUtils.isEmpty(pic)) {
qw.eq("pic", pic);
}
String productNameLike = query.getProductNameLike();
if (!StringUtils.isEmpty(productNameLike)) {
qw.like("product_name", productNameLike);
}
BigDecimal salePrice = query.getSalePrice();
if (salePrice != null) {
qw.eq("sale_price", salePrice);
}
BigDecimal purchasePrice = query.getPurchasePrice();
if (purchasePrice != null) {
qw.eq("purchase_price", purchasePrice);
}
Integer quantity = query.getQuantity();
if (quantity != null) {
qw.eq("quantity", quantity);
}
Long productCategoryId = query.getProductCategoryId();
if (productCategoryId != null) {
qw.eq("product_category_id", productCategoryId);
}
String spData = query.getSpData();
if (!StringUtils.isEmpty(spData)) {
qw.eq("sp_data", spData);
}
return orderItemMapper.selectList(qw);
}
/**
*
*
* @param orderItem
* @return
*/
public int insert(OrderItem orderItem) {
orderItem.setCreateTime(LocalDateTime.now());
return orderItemMapper.insert(orderItem);
}
/**
*
*
* @param orderItem
* @return
*/
public int update(OrderItem orderItem) {
return orderItemMapper.updateById(orderItem);
}
/**
*
*
* @param id
* @return
*/
public int deleteById(Long id) {
return orderItemMapper.deleteById(id);
}
}

@ -0,0 +1,330 @@
package com.ruoyi.mall.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.PhoneUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.mall.domain.*;
import com.ruoyi.mall.domain.query.DeliverProductForm;
import com.ruoyi.mall.domain.query.ManagerOrderQueryForm;
import com.ruoyi.mall.domain.vo.*;
import com.ruoyi.mall.mapper.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* Service
*
*
* @author zcc
*/
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderOperateHistoryMapper orderOperateHistoryMapper;
@Autowired
private ExpressMapper expressMapper;
// @Value("${aes.key}")
// private String aesKey;
@Autowired
private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper;
/**
*
*
* @param id
* @return
*/
public ManagerOrderDetailVO selectById(Long id) {
Order order = orderMapper.selectById(id);
if (order == null){
throw new RuntimeException("查不到订单信息");
}
ManagerOrderDetailVO managerOrderDetailVO = new ManagerOrderDetailVO();
//封装订单信息
managerOrderDetailVO.setOrderId(id);
managerOrderDetailVO.setCouponAmount(order.getCouponAmount());
managerOrderDetailVO.setOrderSn(order.getOrderSn());
managerOrderDetailVO.setOrderStatus(order.getStatus());
managerOrderDetailVO.setCreateTime(order.getCreateTime());
managerOrderDetailVO.setDeliveryTime(order.getDeliveryTime());
managerOrderDetailVO.setExpressName(order.getDeliveryCompany());
managerOrderDetailVO.setExpressNo(order.getDeliverySn());
managerOrderDetailVO.setPayAmount(order.getPayAmount());
managerOrderDetailVO.setPayTime(order.getPaymentTime());
managerOrderDetailVO.setPayType(order.getPayType());
managerOrderDetailVO.setTotalAmount(order.getTotalAmount());
managerOrderDetailVO.setPayAmount(order.getPayAmount());
managerOrderDetailVO.setReceiveTime(order.getReceiveTime());
//封装订单地址信息
ManagerOrderAddressVo managerOrderAddressVo = new ManagerOrderAddressVo();
managerOrderAddressVo.setUserPhone(order.getReceiverPhone());
managerOrderAddressVo.setAddress(order.getReceiverDetailAddress());
managerOrderAddressVo.setArea(
order.getReceiverProvince() +
order.getReceiverCity() +
order.getReceiverDistrict());
managerOrderAddressVo.setName(order.getReceiverName());
managerOrderDetailVO.setAddressInfo(managerOrderAddressVo);
//查询会员信息
// Member member = memberMapper.selectById(order.getMemberId());
// managerOrderDetailVO.setUserName(member.getNickname());
// managerOrderDetailVO.setUserPhone(member.getPhoneHidden());
//查询购买商品信息
QueryWrapper<OrderItem> qw = new QueryWrapper<>();
qw.eq("order_id", order.getId());
List<OrderItem> orderItemList = orderItemMapper.selectList(qw);
List<ManagerOrderProductVO> productList = new ArrayList<>();
orderItemList.forEach(item -> {
ManagerOrderProductVO productVO = new ManagerOrderProductVO();
productVO.setProductId(item.getProductId());
productVO.setBuyNum(item.getQuantity());
productVO.setPic(item.getPic());
productVO.setProductName(item.getProductName());
productVO.setSalePrice(item.getSalePrice());
productVO.setSpData(item.getSpData());
productList.add(productVO);
});
managerOrderDetailVO.setProductInfo(productList);
return managerOrderDetailVO;
}
/**
*
*
* @param query
* @param page
* @return
*/
public PageImpl<ManagerOrderVO> selectList(ManagerOrderQueryForm query, Pageable page) {
if (page != null) {
PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize());
}
query.setStoreId(SecurityUtils.getDeptId());
List<ManagerOrderVO> managerOrderVOList = orderMapper.selectManagerOrderPage(query);
if (CollectionUtil.isEmpty(managerOrderVOList)){
return new PageImpl<>(managerOrderVOList, page, 0);
}
long total = ((com.github.pagehelper.Page) managerOrderVOList).getTotal();
Map<Long, ManagerOrderVO> orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1,v2) -> v2, LinkedHashMap::new));
//查orderItem
QueryWrapper<OrderItem> qw = new QueryWrapper<>();
qw.in("order_id", orderMap.keySet());
qw.eq("store_id",SecurityUtils.getDeptId());
Map<Long, List<OrderItem>> groupedOrderItemMap = orderItemMapper.selectList(qw)
.stream().collect(Collectors.groupingBy(OrderItem::getOrderId));
groupedOrderItemMap.keySet().forEach(key -> {
ManagerOrderVO managerOrderVO = orderMap.get(key);
managerOrderVO.setBuyNum(0);
List<OrderItem> orderItemList = groupedOrderItemMap.get(key);
List<ManagerOrderProductVO> addProductList = new ArrayList<>();
orderItemList.forEach(item -> {
ManagerOrderProductVO vo = new ManagerOrderProductVO();
vo.setProductName(item.getProductName());
vo.setSalePrice(item.getSalePrice());
vo.setPic(item.getPic());
vo.setBuyNum(item.getQuantity());
vo.setProductId(item.getProductId());
vo.setSpData(item.getSpData());
addProductList.add(vo);
managerOrderVO.setBuyNum(managerOrderVO.getBuyNum() + item.getQuantity());
});
managerOrderVO.setProductList(addProductList);
});
return new PageImpl<>(new ArrayList<>(orderMap.values()), page, total);
}
/**
*
*
* @param order
* @return
*/
public int insert(Order order) {
order.setCreateTime(LocalDateTime.now());
return orderMapper.insert(order);
}
/**
*
*
* @param order
* @return
*/
public int update(Order order) {
return orderMapper.updateById(order);
}
/**
*
*
* @param id
* @return
*/
public int deleteById(Long id) {
return orderMapper.deleteById(id);
}
public Integer saveMerchantNote(Order order) {
Order orderInDb = orderMapper.selectById(order.getId());
if (orderInDb == null){
throw new RuntimeException("订单不存在");
}
UpdateWrapper<Order> qw = new UpdateWrapper<>();
qw.eq("id", order.getId());
qw.set("merchant_note", order.getMerchantNote());
return orderMapper.update(null, qw);
}
/**
*
*
* @param request
* @param userId
* @return
*/
@Transactional
public String deliverProduct(DeliverProductForm request, Long userId) {
//查询订单
Order order = orderMapper.selectById(request.getOrderId());
QueryWrapper<OrderItem> qw = new QueryWrapper<>();
qw.eq("order_id", request.getOrderId());
List<OrderItem> orderItemList = orderItemMapper.selectList(qw);
if (order == null || CollectionUtil.isEmpty(orderItemList)){
throw new RuntimeException("未找到该订单信息");
}
// 是否为待发货、已发货 、已完成
if (!(Constants.OrderStatus.SEND.equals(order.getStatus())
|| Constants.OrderStatus.GET.equals(order.getStatus())
|| Constants.OrderStatus.CONFIRM.equals(order.getStatus()))){
throw new RuntimeException("订单状态错误");
}
Integer orderStatus =
Constants.OrderStatus.SEND.equals(order.getStatus()) ? Constants.OrderStatus.GET : order.getStatus();
//更新订单
LocalDateTime optDate = LocalDateTime.now();
order.setUpdateBy(null);
order.setStatus(orderStatus);
order.setDeliveryTime(optDate);
order.setUpdateTime(optDate);
order.setDeliveryCompany(request.getExpressName());
order.setDeliverySn(request.getExpressSn());
orderMapper.updateById(order);
//创建新的发货记录
this.createDeliveryHistory(request, userId, optDate);
//创建订单操作记录
this.createOrderOptHistory(order.getId(), order.getOrderSn(), orderStatus, userId, optDate);
return "发货成功";
}
/**
*
* @param request
* @param userId
* @param optDate
*/
private void createDeliveryHistory(DeliverProductForm request, Long userId, LocalDateTime optDate){
OrderDeliveryHistory orderDeliveryHistory = new OrderDeliveryHistory();
orderDeliveryHistory.setOrderId(request.getOrderId());
orderDeliveryHistory.setDeliveryCompany(request.getExpressName());
orderDeliveryHistory.setDeliverySn(request.getExpressSn());
orderDeliveryHistory.setCreateTime(optDate);
orderDeliveryHistory.setCreateBy(userId);
int rows = orderDeliveryHistoryMapper.insert(orderDeliveryHistory);
if (rows < 1) {
throw new RuntimeException("新增订单发货记录失败");
}
}
/**
*
* @param orderId id
* @param orderStatus
* @param userId
* @param optDate
*/
private void createOrderOptHistory(Long orderId, String orderSn, Integer orderStatus, Long userId, LocalDateTime optDate){
OrderOperateHistory optHistory = new OrderOperateHistory();
optHistory.setOrderId(orderId);
optHistory.setOrderSn(orderSn);
optHistory.setOperateMan(SecurityUtils.getUsername());
optHistory.setOrderStatus(orderStatus);
optHistory.setCreateTime(optDate);
optHistory.setCreateBy(userId);
optHistory.setUpdateBy(userId);
optHistory.setUpdateTime(optDate);
int rows = orderOperateHistoryMapper.insert(optHistory);
if (rows < 1) {
throw new RuntimeException("新增订单操作记录失败");
}
}
/**
* id
* @param orderId id
* @return
*/
public List<OrderOperateHistoryVO> log(Long orderId) {
LambdaQueryWrapper<OrderOperateHistory> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderOperateHistory::getOrderId, orderId);
wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4));
wrapper.orderByDesc(OrderOperateHistory::getCreateTime);
List<OrderOperateHistory> historyList = orderOperateHistoryMapper.selectList(wrapper);
return BeanUtil.copyToList(historyList,OrderOperateHistoryVO.class);
}
public String decryptPhone(Long orderId) {
// Order order = orderMapper.selectById(orderId);
// String receiverPhoneEncrypted = order.getReceiverPhoneEncrypted();
// if(receiverPhoneEncrypted!=null){
// return AesCryptoUtils.decrypt(aesKey,receiverPhoneEncrypted);
// }else {
return null;
// }
}
public Boolean updateReceiver(Order order) {
Order dbOrder = orderMapper.selectById(order.getId());
if (dbOrder == null) {
return false;
}
UpdateWrapper<Order> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("receiver_name",order.getReceiverName())
.set("receiver_phone",PhoneUtils.hidePhone(order.getReceiverPhone()))
.set("receiver_city",order.getReceiverCity())
.set("receiver_district",order.getReceiverDistrict())
.set("receiver_province",order.getReceiverProvince())
.set("receiver_detail_address",order.getReceiverDetailAddress())
// .set("receiver_phone_encrypted",AesCryptoUtils.encrypt(aesKey, order.getReceiverPhone()))
.set("update_time",LocalDateTime.now());
updateWrapper.eq("id",order.getId());
int update = orderMapper.update(null, updateWrapper);
return update == 1;
}
}

@ -50,6 +50,8 @@ public class ProductService {
@Autowired
private BrandMapper brandMapper;
/**
*
*
@ -112,7 +114,7 @@ public class ProductService {
qw.like("name", "%".concat(nameLike).concat("%"));
}
if (ObjectUtil.isNotEmpty(query.getIsCourse())){
qw.eq("is_Course", query.getIsCourse());
qw.eq("is_course", query.getIsCourse());
}
@ -173,11 +175,13 @@ public class ProductService {
Product product = BeanUtil.toBean(productVO,Product.class);
product.setCreateTime(LocalDateTime.now());
product.setStoreId(SecurityUtils.getDeptId());
List<Sku> skuList = productVO.getSkuList();
productMapper.insert(product);
if(skuList!=null){
skuList.forEach(sku -> {
sku.setProductId(product.getId());
sku.setUnit(product.getUnit());
sku.setCreateTime(LocalDateTime.now());
skuMapper.insert(sku);
});
@ -203,6 +207,7 @@ public class ProductService {
List<Sku> skuList = productVO.getSkuList();
product.setUpdateBy(userId);
product.setUpdateTime(LocalDateTime.now());
product.setStoreId(SecurityUtils.getDeptId());
productMapper.updateById(product);
//查找库中所有的sku
Map<String,Object> map = new HashMap<>();
@ -216,6 +221,7 @@ public class ProductService {
Sku sku = skuMap.get(it.getId());
sku.setUpdateBy(SecurityUtils.getUserId());
sku.setUpdateTime(LocalDateTime.now());
sku.setUnit(it.getUnit());
sku.setPrice(it.getPrice());
sku.setSpData(it.getSpData());
sku.setPic(it.getPic());

@ -0,0 +1,119 @@
package com.ruoyi.mall.service;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.ruoyi.mall.domain.Product;
import com.ruoyi.mall.domain.Sku;
import com.ruoyi.mall.domain.query.SkuQuery;
import com.ruoyi.mall.mapper.ProductMapper;
import com.ruoyi.mall.mapper.SkuMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* skuService
*
*
* @author zcc
*/
@Service
public class SkuService {
@Autowired
private SkuMapper skuMapper;
@Autowired
private ProductMapper productMapper;
/**
* sku
*
* @param id sku
* @return sku
*/
public Sku selectById(Long id) {
return skuMapper.selectById(id);
}
/**
* sku
*
* @param query
* @param page
* @return sku
*/
public List<Sku> selectList(SkuQuery query, Pageable page) {
if (page != null) {
PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize());
}
QueryWrapper<Sku> qw = new QueryWrapper<>();
Long productId = query.getProductId();
if (productId != null) {
qw.eq("product_id", productId);
}
String outSkuId = query.getOutSkuId();
if (!StringUtils.isEmpty(outSkuId)) {
qw.eq("out_sku_id", outSkuId);
}
BigDecimal price = query.getPrice();
if (price != null) {
qw.eq("price", price);
}
String pic = query.getPic();
if (!StringUtils.isEmpty(pic)) {
qw.eq("pic", pic);
}
String spData = query.getSpData();
if (!StringUtils.isEmpty(spData)) {
qw.eq("sp_data", spData);
}
return skuMapper.selectList(qw);
}
public void getOutProductId(SkuQuery query){
if (StrUtil.isNotEmpty(query.getOutProductId())){
Product product=productMapper.selectOne(new QueryWrapper<Product>().eq("out_product_id",query.getOutProductId()));
if (ObjectUtil.isEmpty(product)){
throw new RuntimeException("商品编码不存在!");
}else {
query.setProductId(product.getId());
}
}
}
/**
* sku
*
* @param sku sku
* @return
*/
public int insert(Sku sku) {
sku.setCreateTime(LocalDateTime.now());
return skuMapper.insert(sku);
}
/**
* sku
*
* @param sku sku
* @return
*/
public int update(Sku sku) {
return skuMapper.updateById(sku);
}
/**
* sku
*
* @param id sku
* @return
*/
public int deleteById(Long id) {
return skuMapper.deleteById(id);
}
}

@ -10,4 +10,19 @@ public class UploadImageVO {
private String thumbUrl;//缩略图
public void setOriginUrl(String originUrl) {
this.originUrl = replaceUrl(originUrl);
}
public void setThumbUrl(String thumbUrl) {
this.thumbUrl = replaceUrl(thumbUrl);
}
public String replaceUrl(String url){
String newUrl=url.replace("http://62.234.183.14:9000/","https://www.sanduolantoyoga.com/minio/");
return newUrl;
}
}

@ -83,7 +83,8 @@ public class FileServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> impl
fileInfo.setUploadTime(new Date());
this.updateById(fileInfo);
// 返回
return fileInfo.getFilePath();
return fileInfo.getFilePath().replace("http://62.234.183.14:9000/","https://www.sanduolantoyoga.com/minio/");
}
// 上传
String fileName = minioSerivce.upload(minioProps.getBucketName(), minioProps.getFilePath(), file);
@ -94,6 +95,7 @@ public class FileServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> impl
// 保存文件
saveFileInfo(file, md5, url);
log.info("文件文件成功用户id:{},url:{}", userId, url);
url=url.replace("http://62.234.183.14:9000/","https://www.sanduolantoyoga.com/minio/");
return url;
} catch (IOException e) {
log.error("上传图片失败,{}", e.getMessage(), e);

@ -79,7 +79,9 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
// 不展示超级管理租户
qw.ne("super_tenant", "1");
qw.orderByDesc("in_use", "create_time");
qw.orderByAsc("in_use");
qw.orderByDesc("create_time");
RespPage<SysTenant> page = new RespPage(reqSearchSysTenant.getPageNum(), reqSearchSysTenant.getPageSize());
RespPage<SysTenant> listPage = page(page, qw);
return new RestResponse().setData(listPage);

@ -0,0 +1,34 @@
<?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.ruoyi.mall.mapper.AddressMapper">
<resultMap type="Address" id="AddressResult">
<result property="id" column="id"/>
<result property="code" column="code"/>
<result property="parentCode" column="parent_code"/>
<result property="name" column="name"/>
<result property="level" column="level"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="deletedAt" column="deleted_at"/>
</resultMap>
<sql id="selectAddressVo">
select id, code, parent_code, name, level, created_at, updated_at, deleted_at from address
</sql>
<select id="selectByEntity" parameterType="Address" resultMap="AddressResult">
<include refid="selectAddressVo"/>
<where>
<if test="code != null "> and code = #{code}</if>
<if test="parentCode != null "> and parent_code = #{parentCode}</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
<if test="level != null "> and level = #{level}</if>
<if test="createdAt != null and createdAt != ''"> and created_at = #{createdAt}</if>
<if test="updatedAt != null and updatedAt != ''"> and updated_at = #{updatedAt}</if>
<if test="deletedAt != null and deletedAt != ''"> and deleted_at = #{deletedAt}</if>
</where>
</select>
</mapper>

@ -15,5 +15,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
IFNULL(sum(case when status=1 then 1 else 0 end), 0) processingAftersaleCount
from oms_aftersale
</select>
<select id="selectManagerRefundOrder" resultType="ManagerRefundOrderVO">
SELECT DISTINCT
a.id id,
a.return_amount applyReturnAmount,
a.quantity refundNum,
a.type applyRefundType,
a.reason reason,
a.description description,
a.proof_pics proof_pics,
a.order_id orderId,
a.create_time applyRefundTime,
a.status aftersaleStatus,
a.handle_time handleTime,
a.handle_note note,
a.handle_man,
c.nick_name nickName,
c.phone_number phone,
-- c.mark,
a.refund_wp_code refundWpCode,
a.refund_waybill_code refundWaybillCode
FROM oms_aftersale a
left join yj_app_user c on a.member_id = c.app_user_id
LEFT JOIN oms_aftersale_item b on a.id=b.aftersale_id
<where>
b.store_id=#{storeId}
<if test="id != null">
and a.id = #{id}
</if>
<if test="orderSn != null and orderSn != ''">
and a.order_id = #{orderSn}
</if>
<if test="userPhone != null and userPhone != ''">
and c.phone_number=#{userPhone}
</if>
<if test="status != null">
and a.status = #{status}
</if>
<if test="type != null">
and a.type = #{type}
</if>
<if test="startTime != null and endTime != null">
and a.create_time between #{startTime} and #{endTime}
</if>
</where>
order by a.create_time desc
</select>
</mapper>

@ -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.ruoyi.mall.mapper.ExpressMapper">
</mapper>

@ -0,0 +1,102 @@
<?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.ruoyi.mall.mapper.MemberAddressMapper">
<resultMap type="MemberAddress" id="MemberAddressResult">
<result property="id" column="id"/>
<result property="memberId" column="member_id"/>
<result property="name" column="name"/>
<result property="phoneHidden" column="phone_hidden"/>
<result property="phoneEncrypted" column="phone_encrypted"/>
<result property="defaultStatus" column="default_status"/>
<result property="postCode" column="post_code"/>
<result property="province" column="province"/>
<result property="city" column="city"/>
<result property="district" column="district"/>
<result property="detailAddress" column="detail_address"/>
<result property="isDefault" column="is_default"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectMemberAddressVo">
select id, member_id, name, phone_hidden,phone_encrypted, default_status, post_code, province, city, district, detail_address, is_default, create_by, create_time, update_by, update_time from mall_member_address
</sql>
<select id="selectByEntity" parameterType="MemberAddress" resultMap="MemberAddressResult">
<include refid="selectMemberAddressVo"/>
<where>
<if test="memberId != null "> and member_id = #{memberId}</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
<if test="defaultStatus != null "> and default_status = #{defaultStatus}</if>
<if test="postCode != null and postCode != ''"> and post_code = #{postCode}</if>
<if test="province != null and province != ''"> and province = #{province}</if>
<if test="city != null and city != ''"> and city = #{city}</if>
<if test="district != null and district != ''"> and district = #{district}</if>
<if test="detailAddress != null and detailAddress != ''"> and detail_address = #{detailAddress}</if>
<if test="isDefault != null "> and is_default = #{isDefault}</if>
</where>
</select>
<update id="updateByPrimaryKeySelective" parameterType="MemberAddress">
update mall_member_address
<set>
<if test="memberId != null">
member_id = #{memberId, jdbcType=BIGINT},
</if>
<if test="name != null">
name = #{name, jdbcType=BIGINT},
</if>
<if test="phone != null">
phone = #{phone, jdbcType=BIGINT},
</if>
<if test="defaultStatus != null">
default_status = #{defaultStatus, jdbcType=BIGINT},
</if>
<if test="postCode != null">
post_code = #{postCode, jdbcType=BIGINT},
</if>
<if test="province != null">
province = #{province, jdbcType=BIGINT},
</if>
<if test="city != null">
city = #{city, jdbcType=BIGINT},
</if>
<if test="district != null">
district = #{district, jdbcType=BIGINT},
</if>
<if test="detailAddress != null">
detail_address = #{detailAddress, jdbcType=BIGINT},
</if>
<if test="isDefault != null">
is_default = #{isDefault, jdbcType=BIGINT},
</if>
<if test="createBy != null">
create_by = #{createBy, jdbcType=BIGINT},
</if>
<if test="createTime != null">
create_time = #{createTime, jdbcType=BIGINT},
</if>
<if test="updateBy != null">
update_by = #{updateBy, jdbcType=BIGINT},
</if>
<if test="updateTime != null">
update_time = #{updateTime, jdbcType=BIGINT},
</if>
</set>
where id = #{id, jdbcType=BIGINT}
</update>
<update id="updateDefault">
update mall_member_address
set is_default = #{param1}
where member_id = #{param2}
</update>
</mapper>

@ -0,0 +1,34 @@
<?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.ruoyi.mall.mapper.OrderDeliveryHistoryMapper">
<resultMap type="OrderDeliveryHistory" id="OrderDeliveryHistoryResult">
<result property="id" column="id"/>
<result property="orderId" column="order_id"/>
<result property="deliveryCompany" column="delivery_company"/>
<result property="deliverySn" column="delivery_sn"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectOrderDeliveryHistoryVo">
select id, order_id, delivery_company, delivery_sn, create_by, create_time, update_by, update_time from oms_order_delivery_history
</sql>
<select id="selectByEntity" parameterType="OrderDeliveryHistory" resultMap="OrderDeliveryHistoryResult">
<include refid="selectOrderDeliveryHistoryVo"/>
<where>
<if test="orderId != null "> and order_id = #{orderId}</if>
<if test="deliveryCompany != null and deliveryCompany != ''"> and delivery_company = #{deliveryCompany}</if>
<if test="deliverySn != null and deliverySn != ''"> and delivery_sn = #{deliverySn}</if>
</where>
</select>
</mapper>

@ -0,0 +1,56 @@
<?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.ruoyi.mall.mapper.OrderItemMapper">
<resultMap type="OrderItem" id="OrderItemResult">
<result property="id" column="id"/>
<result property="orderId" column="order_id"/>
<result property="productId" column="product_id"/>
<result property="outProductId" column="out_product_id"/>
<result property="skuId" column="sku_id"/>
<result property="outSkuId" column="out_sku_id"/>
<result property="productSnapshotId" column="product_snapshot_id"/>
<result property="skuSnapshotId" column="sku_snapshot_id"/>
<result property="pic" column="pic"/>
<result property="productName" column="product_name"/>
<result property="salePrice" column="sale_price"/>
<result property="purchasePrice" column="purchase_price"/>
<result property="quantity" column="quantity"/>
<result property="productCategoryId" column="product_category_id"/>
<result property="spData" column="sp_data"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectOrderItemVo">
select id, order_id, product_id, out_product_id, sku_id, out_sku_id, product_snapshot_id, sku_snapshot_id, pic, product_name, sale_price, purchase_price, quantity, product_category_id, sp_data, create_by, create_time, update_by, update_time from oms_order_item
</sql>
<select id="selectByEntity" parameterType="OrderItem" resultMap="OrderItemResult">
<include refid="selectOrderItemVo"/>
<where>
<if test="orderId != null "> and order_id = #{orderId}</if>
<if test="productId != null "> and product_id = #{productId}</if>
<if test="outProductId != null and outProductId != ''"> and out_product_id = #{outProductId}</if>
<if test="skuId != null "> and sku_id = #{skuId}</if>
<if test="outSkuId != null and outSkuId != ''"> and out_sku_id = #{outSkuId}</if>
<if test="productSnapshotId != null "> and product_snapshot_id = #{productSnapshotId}</if>
<if test="skuSnapshotId != null "> and sku_snapshot_id = #{skuSnapshotId}</if>
<if test="pic != null and pic != ''"> and pic = #{pic}</if>
<if test="productName != null and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
<if test="salePrice != null "> and sale_price = #{salePrice}</if>
<if test="purchasePrice != null "> and purchase_price = #{purchasePrice}</if>
<if test="quantity != null "> and quantity = #{quantity}</if>
<if test="productCategoryId != null "> and product_category_id = #{productCategoryId}</if>
<if test="spData != null and spData != ''"> and sp_data = #{spData}</if>
</where>
</select>
</mapper>

@ -4,6 +4,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.mall.mapper.OrderMapper">
<sql id="selectOrderVo">
select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time from oms_order
</sql>
<select id="statWaitDelivered" resultType="java.lang.Integer">
select IFNULL(count(id), 0) from oms_order where status=1 and aftersale_status=1
</select>
@ -16,6 +19,143 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
from oms_order
where create_time between #{startTime} and #{endTime}
</select>
<select id="selectByEntity" parameterType="Order" resultMap="OrderResult">
<include refid="selectOrderVo"/>
<where>
<if test="memberId != null "> and member_id = #{memberId}</if>
<if test="memberUsername != null and memberUsername != ''"> and member_username like concat('%', #{memberUsername}, '%')</if>
<if test="totalAmount != null "> and total_amount = #{totalAmount}</if>
<if test="purchasePrice != null "> and purchase_price = #{purchasePrice}</if>
<if test="payAmount != null "> and pay_amount = #{payAmount}</if>
<if test="freightAmount != null "> and freight_amount = #{freightAmount}</if>
<if test="payType != null "> and pay_type = #{payType}</if>
<if test="status != null "> and status = #{status}</if>
<if test="aftersaleStatus != null "> and aftersale_status = #{aftersaleStatus}</if>
<if test="deliveryCompany != null and deliveryCompany != ''"> and delivery_company = #{deliveryCompany}</if>
<if test="deliverySn != null and deliverySn != ''"> and delivery_sn = #{deliverySn}</if>
<if test="autoConfirmDay != null "> and auto_confirm_day = #{autoConfirmDay}</if>
<if test="receiverName != null and receiverName != ''"> and receiver_name like concat('%', #{receiverName}, '%')</if>
<if test="receiverPhone != null and receiverPhone != ''"> and receiver_phone = #{receiverPhone}</if>
<if test="receiverPostCode != null and receiverPostCode != ''"> and receiver_post_code = #{receiverPostCode}</if>
<if test="receiverProvince != null and receiverProvince != ''"> and receiver_province = #{receiverProvince}</if>
<if test="receiverCity != null and receiverCity != ''"> and receiver_city = #{receiverCity}</if>
<if test="receiverDistrict != null and receiverDistrict != ''"> and receiver_district = #{receiverDistrict}</if>
<if test="receiverProvinceId != null "> and receiver_province_id = #{receiverProvinceId}</if>
<if test="receiverCityId != null "> and receiver_city_id = #{receiverCityId}</if>
<if test="receiverDistrictId != null "> and receiver_district_id = #{receiverDistrictId}</if>
<if test="receiverDetailAddress != null and receiverDetailAddress != ''"> and receiver_detail_address = #{receiverDetailAddress}</if>
<if test="note != null and note != ''"> and note = #{note}</if>
<if test="confirmStatus != null "> and confirm_status = #{confirmStatus}</if>
<if test="deleteStatus != null "> and delete_status = #{deleteStatus}</if>
<if test="paymentTime != null "> and payment_time = #{paymentTime}</if>
<if test="deliveryTime != null "> and delivery_time = #{deliveryTime}</if>
<if test="receiveTime != null "> and receive_time = #{receiveTime}</if>
</where>
</select>
<select id="selectManagerOrderPage" resultType="ManagerOrderVO">
select DISTINCT
a.id,
a.order_sn orderSn,
a.aftersale_status aftersaleStatus,
a.status,
a.member_username userName,
a.total_amount totalAmount,
a.pay_amount payAmount,
a.note,
a.merchant_note merchantNote,
a.create_time createTime,
a.payment_time payTime,
a.receive_time receiveTime,
a.pay_type payType,
a.receiver_name receiverName,
a.receiver_phone receiverPhone,
a.receiver_province receiverProvince,
a.coupon_amount couponAmount,
a.receiver_city receiverCity,
a.receiver_district receiverDistrict,
a.receiver_detail_address receiverDetailAddress,
a.delivery_time deliveryTime,
a.delivery_sn deliverySn,
-- b.quantity buyNum,
-- b.pic,
-- b.sp_data spData,
-- b.product_id productId,
-- b.product_name productName,
-- c.phone_hidden userPhone,
u.nick_name nickName
from oms_order a
-- left join oms_order_item b on a.id = b.order_id
-- left join ums_member c on a.member_id = c.id
left join yj_app_user u on a.member_id = u.app_user_id
LEFT JOIN oms_order_item b on a.id=b.order_id
where a.aftersale_status = 1 and b.store_id=#{storeId}
<if test="orderSn != null and orderSn != ''">
and a.order_sn = #{orderSn}
</if>
<!--<if test="productName != null and productName != ''">-->
<!--and instr(b.product_name, #{productName}) > 0-->
<!--</if>-->
<if test="receiverProvince != null ">
and a.receiver_province = #{receiverProvince}
</if>
<if test="receiverCity != null">
and a.receiver_city = #{receiverCity}
</if>
<if test="receiverDistrict != null">
and a.receiver_district = #{receiverDistrict}
</if>
<if test="userPhone != null and userPhone != ''">
and u.phone_number=#{userPhone}
</if>
<if test="status != null">
and a.status = #{status}
</if>
<if test="payType != null">
and a.pay_type=#{payType}
</if>
<if test="startTime != null and endTime != null">
and a.create_time between #{startTime} and #{endTime}
</if>
order by a.create_time desc
</select>
<resultMap type="Order" id="OrderResult">
<result property="id" column="id"/>
<result property="memberId" column="member_id"/>
<result property="memberUsername" column="member_username"/>
<result property="totalAmount" column="total_amount"/>
<result property="purchasePrice" column="purchase_price"/>
<result property="payAmount" column="pay_amount"/>
<result property="freightAmount" column="freight_amount"/>
<result property="payType" column="pay_type"/>
<result property="status" column="status"/>
<result property="aftersaleStatus" column="aftersale_status"/>
<result property="deliveryCompany" column="delivery_company"/>
<result property="deliverySn" column="delivery_sn"/>
<result property="autoConfirmDay" column="auto_confirm_day"/>
<result property="receiverName" column="receiver_name"/>
<result property="receiverPhone" column="receiver_phone"/>
<result property="receiverPostCode" column="receiver_post_code"/>
<result property="receiverProvince" column="receiver_province"/>
<result property="receiverCity" column="receiver_city"/>
<result property="receiverDistrict" column="receiver_district"/>
<result property="receiverProvinceId" column="receiver_province_id"/>
<result property="receiverCityId" column="receiver_city_id"/>
<result property="receiverDistrictId" column="receiver_district_id"/>
<result property="receiverDetailAddress" column="receiver_detail_address"/>
<result property="note" column="note"/>
<result property="confirmStatus" column="confirm_status"/>
<result property="deleteStatus" column="delete_status"/>
<result property="paymentTime" column="payment_time"/>
<result property="deliveryTime" column="delivery_time"/>
<result property="receiveTime" column="receive_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time" />
</resultMap>
</mapper>

@ -0,0 +1,37 @@
<?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.ruoyi.mall.mapper.OrderOperateHistoryMapper">
<resultMap type="OrderOperateHistory" id="OrderOperateHistoryResult">
<result property="id" column="id"/>
<result property="orderId" column="order_id"/>
<result property="orderSn" column="order_sn"/>
<result property="operateMan" column="operate_man"/>
<result property="orderStatus" column="order_status"/>
<result property="note" column="note"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectOrderOperateHistoryVo">
select id, order_id, operate_man, order_status, note, create_by, create_time, update_by, update_time from oms_order_operate_history
</sql>
<select id="selectByEntity" parameterType="OrderOperateHistory" resultMap="OrderOperateHistoryResult">
<include refid="selectOrderOperateHistoryVo"/>
<where>
<if test="orderId != null "> and order_id = #{orderId}</if>
<if test="operateMan != null and operateMan != ''"> and operate_man = #{operateMan}</if>
<if test="orderStatus != null "> and order_status = #{orderStatus}</if>
<if test="note != null and note != ''"> and note = #{note}</if>
</where>
</select>
</mapper>

@ -0,0 +1,8 @@
<?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.ruoyi.mall.mapper.YjAppUserMapper">
</mapper>
Loading…
Cancel
Save