package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.BaseModel; import com.ruoyi.common.core.domain.BasePage; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.system.dto.ExchangeGoodsDto; import com.ruoyi.system.dto.TErpGoodsUpdateStatusDto; import com.ruoyi.system.model.*; import com.ruoyi.system.query.ExchangeGoodsRecordQuery; import com.ruoyi.system.query.TSysGoodsExchangeQuery; import com.ruoyi.system.query.TSysGoodsQuery; import com.ruoyi.system.service.*; import com.ruoyi.system.vo.ExchangeGoodsRecordDetailVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** *

* 积分商品信息 前端控制器 *

* * @author xiaochen * @since 2025-08-20 */ @RestController @RequestMapping("/t-sys-goods") @Api(tags = "积分商品管理") public class TSysGoodsController { private final TSysGoodsService sysGoodsService; private final TokenService tokenService; private final TCrmSupplierService crmSupplierService; private final TSysGoodsExchangeService sysGoodsExchangeService; private final TCrmClinicService crmClinicService; private final TCrmClinicPointsService crmClinicPointsService; private final TCrmChangePointsService crmChangePointsService; @Autowired public TSysGoodsController(TokenService tokenService, TSysGoodsService sysGoodsService, TCrmSupplierService crmSupplierService, TSysGoodsExchangeService sysGoodsExchangeService, TCrmClinicService crmClinicService, TCrmClinicPointsService crmClinicPointsService, TCrmChangePointsService crmChangePointsService) { this.sysGoodsService = sysGoodsService; this.tokenService = tokenService; this.crmSupplierService = crmSupplierService; this.sysGoodsExchangeService = sysGoodsExchangeService; this.crmClinicService = crmClinicService; this.crmClinicPointsService = crmClinicPointsService; this.crmChangePointsService = crmChangePointsService; } /** * 获取积分商品列表 */ @ApiOperation(value = "获取积分商品列表--供应商") @PostMapping(value = "/pageList") public R> pageList(@RequestBody TSysGoodsQuery query) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); if (roleType == 4) { // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); LambdaQueryWrapper tSysGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); tSysGoodsLambdaQueryWrapper.eq(TSysGoods::getSupplierId, crmSupplier.getId()); if (query.getGoodsName() != null && !query.getGoodsName().isEmpty()) { tSysGoodsLambdaQueryWrapper.like(TSysGoods::getGoodsName, query.getGoodsName()); } if (query.getStatus() != null) { tSysGoodsLambdaQueryWrapper.eq(TSysGoods::getStatus, query.getStatus()); } tSysGoodsLambdaQueryWrapper.orderByDesc(BaseModel::getCreateTime); Page page = sysGoodsService.page(pageInfo, tSysGoodsLambdaQueryWrapper); List records = page.getRecords(); if (!records.isEmpty()) { List list = sysGoodsExchangeService.list(new LambdaQueryWrapper().in(TSysGoodsExchange::getGoodsId, records.stream().map(TSysGoods::getId).collect(Collectors.toList()))); records.forEach(item -> { item.setExchangeQuantity(list.stream().filter(item1 -> item1.getGoodsId().equals(item.getId())).mapToInt(TSysGoodsExchange::getGoodsCount).sum()); if(item.getGoodsTotal()!=null){ item.setSurplusQuantity(item.getGoodsTotal() - item.getExchangeQuantity()); } }); } pageInfo.setRecords(records); return R.ok(pageInfo); } return R.ok(pageInfo); } @ApiOperation(value = "添加积分商品--供应商") @PostMapping(value = "/add") public R add(@RequestBody TSysGoods goods) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 4) { // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); goods.setSupplierId(crmSupplier.getId()); sysGoodsService.save(goods); return R.ok(goods.getId()); } return R.ok(); } @ApiOperation(value = "编辑积分商品--供应商") @PostMapping(value = "/update") public R update(@RequestBody TSysGoods goods) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); List list = sysGoodsExchangeService.list(new LambdaQueryWrapper().eq(TSysGoodsExchange::getGoodsId, goods.getId())); int sum = list.stream().mapToInt(TSysGoodsExchange::getGoodsCount).sum(); if (goods.getGoodsTotal() < sum) { return R.fail("商品总数不能小于已兑换数量"); } if (roleType == 4) { // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); goods.setSupplierId(crmSupplier.getId()); sysGoodsService.updateById(goods); return R.ok(goods.getId()); } return R.ok(); } @ApiOperation(value = "删除积分商品--供应商") @DeleteMapping(value = "/delete/{id}") public R delete(@PathVariable String id) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 4) { // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); TSysGoods goods = sysGoodsService.getById(id); if (goods.getSupplierId().equals(crmSupplier.getId())) { sysGoodsService.removeById(id); } else { return R.fail("没有权限"); } } return R.ok(); } @ApiOperation(value = "积分商品 上下架--供应商") @PostMapping(value = "/updateStatus") public R updateStatus(@RequestBody @Valid TErpGoodsUpdateStatusDto dto) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 4) { // 供应商 TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class) .eq(TCrmSupplier::getUserId, user.getUserId()) .last("LIMIT 1")); TSysGoods goods = sysGoodsService.getById(dto.getId()); if (goods.getSupplierId().equals(crmSupplier.getId())) { goods.setStatus(dto.getState()); sysGoodsService.updateById(goods); } else { return R.fail("没有权限"); } } return R.ok(); } // 获取兑换记录 @ApiOperation(value = "获取兑换记录--供应商") @PostMapping(value = "/getExchangeRecord") public R> getExchangeRecord(@RequestBody @Valid TSysGoodsExchangeQuery query) { PageInfo page = new PageInfo<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); if(query.getId()!=null && !query.getId().isEmpty()){ wrapper.eq(TSysGoodsExchange::getGoodsId, query.getId()); } if (query.getClinicName() != null && !query.getClinicName().isEmpty()) { wrapper.like(TSysGoodsExchange::getClinicName, query.getClinicName()); } if (query.getTime() != null && !query.getTime().isEmpty()) { wrapper.between(TSysGoodsExchange::getCreateTime, query.getTime().split(" - ")[0] + " 00:00:00", query.getTime().split(" - ")[1] + " 23:59:59"); } if (query.getStatus() != null) { wrapper.eq(TSysGoodsExchange::getStatus, query.getStatus()); } wrapper.orderByDesc(BaseModel::getCreateTime); PageInfo page1 = sysGoodsExchangeService.page(page, wrapper); return R.ok(page1); } // 获取兑换记录 @ApiOperation(value = "发货--供应商") @PostMapping(value = "/sendGoods") public R sendGoods(@RequestBody @Valid TSysGoodsExchange exchange) { TSysGoodsExchange exchange1 = sysGoodsExchangeService.getById(exchange.getId()); if (exchange1.getStatus() == 2) { return R.fail("该订单已发货"); } exchange1.setStatus(2); exchange1.setLogisticsNumber(exchange1.getLogisticsNumber()); sysGoodsExchangeService.updateById(exchange1); return R.ok(); } /** * 获取积分商品列表 */ @ApiOperation(value = "获取积分商品列表--诊所") @PostMapping(value = "/pageListClinic") public R> pageListClinic(@RequestBody TSysGoodsQuery query) { PageInfo pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper tSysGoodsLambdaQueryWrapper = new LambdaQueryWrapper<>(); tSysGoodsLambdaQueryWrapper.eq(TSysGoods::getStatus, 1); if (query.getGoodsName() != null && !query.getGoodsName().isEmpty()) { tSysGoodsLambdaQueryWrapper.like(TSysGoods::getGoodsName, query.getGoodsName()); } tSysGoodsLambdaQueryWrapper.orderByDesc(BaseModel::getCreateTime); Page page = sysGoodsService.page(pageInfo, tSysGoodsLambdaQueryWrapper); List records = page.getRecords(); if (!records.isEmpty()) { List list = sysGoodsExchangeService.list(new LambdaQueryWrapper().in(TSysGoodsExchange::getGoodsId, records.stream().map(TSysGoods::getId).collect(Collectors.toList()))); records.forEach(item -> { item.setExchangeQuantity(list.stream().filter(item1 -> item1.getGoodsId().equals(item.getId())).mapToInt(TSysGoodsExchange::getGoodsCount).sum()); item.setSurplusQuantity(item.getGoodsTotal() - item.getExchangeQuantity()); }); } pageInfo.setRecords(records); HashMap map = new HashMap<>(); map.put("data", pageInfo); // 获取我的可用积分 map.put("total", sysGoodsService.count(tSysGoodsLambdaQueryWrapper)); SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 5) { // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); List list = crmClinicPointsService.list(new LambdaQueryWrapper().eq(TCrmClinicPoints::getClinicId, crmClinic.getId()).ge(TCrmClinicPoints::getExpireTime, new Date()).last(" and points > use_points")); map.put("myPoints", list.stream().mapToInt(item -> item.getPoints() - item.getUsePoints()).sum()); } return R.ok(map); } /** * 获取积分商品详情 */ @ApiOperation(value = "获取积分商品列表--详情") @GetMapping(value = "/detail/{id}") public R detail(@PathVariable String id) { TSysGoods goods = sysGoodsService.getById(id); return R.ok(goods); } /** * 兑换商品 */ @ApiOperation(value = "兑换商品--诊所") @PostMapping(value = "/exchangeGoods") public R exchangeGoods(@RequestBody @Valid ExchangeGoodsDto dto) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 5) { // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); sysGoodsService.exchangeGoods(crmClinic, dto); return R.ok(); } return R.fail("请选择正确的角色"); } /** * 兑换商品记录 */ @ApiOperation(value = "兑换商品记录--诊所") @PostMapping(value = "/exchangeGoodsRecord") public R exchangeGoodsRecord(@RequestBody ExchangeGoodsRecordQuery query) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 5) { // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); LambdaQueryWrapper eq = new LambdaQueryWrapper().eq(TSysGoodsExchange::getClinicId, crmClinic.getId()); if (query.getName() != null && !query.getName().isEmpty()) { eq.like(TSysGoodsExchange::getGoodsName, query.getName()); } eq.orderByDesc(BaseModel::getCreateTime); PageInfo page = sysGoodsExchangeService.page(new PageInfo<>(query.getPageNum(), query.getPageSize()), eq); return R.ok(page); } return R.fail("请选择正确的角色"); } /** * 兑换商品记录 */ @ApiOperation(value = "兑换商品记录详情--诊所") @GetMapping(value = "/exchangeGoodsRecordDetail/{id}") public R exchangeGoodsRecord(@PathVariable String id) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 5) { // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); TSysGoodsExchange exchangeServiceById = sysGoodsExchangeService.getById(id); if (exchangeServiceById.getClinicId().equals(crmClinic.getId())) { ExchangeGoodsRecordDetailVo vo = new ExchangeGoodsRecordDetailVo(); BeanUtils.copyProperties(exchangeServiceById, vo); String goodsId = vo.getGoodsId(); TSysGoods sysGoods = sysGoodsService.getById(goodsId); vo.setGoodsDetail(sysGoods.getGoodsDetail()); vo.setGoodsCover(sysGoods.getGoodsCover()); return R.ok(vo); } } return R.fail("请选择正确的角色"); } /** * 兑换商品记录 */ @ApiOperation(value = "积分变更记录--诊所") @PostMapping(value = "/pointsRecordDetail") public R> pointsRecordDetail(@RequestBody BasePage page) { SysUser user = tokenService.getLoginUser().getUser(); Integer roleType = user.getRoleType(); if (roleType == 5) { // 诊所 TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class) .eq(TCrmClinic::getUserId, user.getUserId()) .last("LIMIT 1")); PageInfo page1 = crmChangePointsService.page(new PageInfo<>(page.getPageNum(), page.getPageSize()), new LambdaQueryWrapper().eq(TCrmChangePoints::getBranchSalespersonId, crmClinic.getId()).eq(TCrmChangePoints::getUserType, 3).orderByDesc(BaseModel::getCreateTime)); return R.ok(page1); } return R.fail("请选择正确的角色"); } }