diff --git a/sql/20240223_customer_update_mysql.sql b/sql/20240223_customer_update_mysql.sql new file mode 100644 index 0000000..f551e1d --- /dev/null +++ b/sql/20240223_customer_update_mysql.sql @@ -0,0 +1,6 @@ +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2504, '客服管理', '', 2, 4, 2000, 'customerService', 'ep:avatar', 'product/customerService/index', '', 0, b'1', b'1', b'1', '1', '2024-02-23 17:30:08', '1', '2024-02-23 17:52:21', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2505, '新增客服', 'product:customerService:create', 3, 1, 2504, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-23 17:30:38', '1', '2024-02-23 17:31:34', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2506, '编辑客服', 'product:customerService:update', 3, 2, 2504, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-23 17:31:01', '1', '2024-02-23 17:31:01', b'0'); +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2507, '删除客服', 'product:customerService:delete', 3, 3, 2504, '', '', '', '', 0, b'1', b'1', b'1', '1', '2024-02-23 17:31:21', '1', '2024-02-23 17:31:21', b'0'); + +alter table yshop_customer_service add column avatar_url varchar(255) comment '客服头像url'; \ No newline at end of file diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java index b9073c1..9772337 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/CustomerServiceController.java @@ -1,11 +1,12 @@ package co.yixiang.yshop.module.mp.controller.admin.customerservice; +import cn.hutool.core.io.FileTypeUtil; +import cn.hutool.core.io.FileUtil; import co.yixiang.yshop.framework.common.pojo.CommonResult; import co.yixiang.yshop.framework.common.pojo.PageParam; import co.yixiang.yshop.framework.common.pojo.PageResult; -import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.AddServicerDTO; -import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; -import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.ServicerVO; +import co.yixiang.yshop.module.infra.api.file.FileApi; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.*; import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; import co.yixiang.yshop.module.mp.service.customerservice.CustomerServiceService; import io.swagger.v3.oas.annotations.Operation; @@ -21,12 +22,15 @@ import me.chanjar.weixin.cp.api.WxCpMediaService; import me.chanjar.weixin.cp.api.WxCpUserService; import me.chanjar.weixin.cp.bean.WxCpDepart; import me.chanjar.weixin.cp.bean.WxCpUser; -import me.chanjar.weixin.cp.bean.kf.*; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAddResp; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountDel; +import me.chanjar.weixin.cp.bean.kf.WxCpKfServicerListResp; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; import java.util.List; import java.util.stream.Collectors; @@ -42,6 +46,8 @@ import java.util.stream.Collectors; public class CustomerServiceController { @Resource private CustomerServiceService customerServiceService; + @Resource + private FileApi fileApi; @SneakyThrows @GetMapping("page") @@ -54,7 +60,7 @@ public class CustomerServiceController { @SneakyThrows @PostMapping @Operation(summary = "新增客服") - public CommonResult save(@RequestBody WxCpKfAccountAdd add) { + public CommonResult save(@RequestBody WxCpKfAccountAddDTO add) { WxCpKfAccountAddResp wxCpKfAccountAddResp = customerServiceService.save(add); return CommonResult.success(wxCpKfAccountAddResp); } @@ -62,7 +68,7 @@ public class CustomerServiceController { @SneakyThrows @PutMapping @Operation(summary = "编辑客服") - public CommonResult update(@RequestBody WxCpKfAccountUpd upd) { + public CommonResult update(@RequestBody WxCpKfAccountUpdDTO upd) { customerServiceService.update(upd); return CommonResult.success(true); } @@ -142,7 +148,16 @@ public class CustomerServiceController { public CommonResult uploadMaterial(@RequestParam(value = "file") MultipartFile file) { WxCpMediaService mediaService = WxCpConfiguration.getCpService().getMediaService(); WxMediaUploadResult upload = mediaService.upload(WxConsts.MediaFileType.IMAGE, file.getOriginalFilename(), file.getInputStream()); + //获取url + File download = mediaService.download(upload.getMediaId()); + String url = uploadFile(upload.getMediaId(), download); + upload.setUrl(url); return CommonResult.success(upload); } + private String uploadFile(String mediaId, File file) { + String path = mediaId + "." + FileTypeUtil.getType(file); + return fileApi.createFile(path, FileUtil.readBytes(file)); + } + } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java index 3d5c8e4..bc5376e 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/CustomerServiceVO.java @@ -18,6 +18,9 @@ public class CustomerServiceVO { @Schema(description = "客服头像") private String avatar; + @Schema(description = "客服头像") + private String avatarUrl; + @Schema(description = "客服地址") private String accountLink; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountAddDTO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountAddDTO.java new file mode 100644 index 0000000..cdac9c3 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountAddDTO.java @@ -0,0 +1,13 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice.vo; + +import lombok.Data; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAdd; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class WxCpKfAccountAddDTO extends WxCpKfAccountAdd { + private String avatarUrl; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountUpdDTO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountUpdDTO.java new file mode 100644 index 0000000..ebef853 --- /dev/null +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/controller/admin/customerservice/vo/WxCpKfAccountUpdDTO.java @@ -0,0 +1,13 @@ +package co.yixiang.yshop.module.mp.controller.admin.customerservice.vo; + +import lombok.Data; +import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountUpd; + +/** + * @author pepis + * @apiNote + **/ +@Data +public class WxCpKfAccountUpdDTO extends WxCpKfAccountUpd { + private String avatarUrl; +} diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java index 1f001a1..ba03fea 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/dal/dataobject/customerservice/CustomerServiceDO.java @@ -45,4 +45,9 @@ public class CustomerServiceDO extends BaseDO { * 客服头像 */ private String avatar; + + /** + * 客服头像url + */ + private String avatarUrl; } diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java index 335b906..57d0024 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceService.java @@ -3,11 +3,11 @@ package co.yixiang.yshop.module.mp.service.customerservice; import co.yixiang.yshop.framework.common.pojo.PageParam; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.WxCpKfAccountAddDTO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.WxCpKfAccountUpdDTO; import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; -import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAdd; import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountAddResp; import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountDel; -import me.chanjar.weixin.cp.bean.kf.WxCpKfAccountUpd; import java.util.List; @@ -18,9 +18,9 @@ import java.util.List; public interface CustomerServiceService { PageResult page(PageParam pageParam); - WxCpKfAccountAddResp save(WxCpKfAccountAdd add); + WxCpKfAccountAddResp save(WxCpKfAccountAddDTO add); - void update(WxCpKfAccountUpd upd); + void update(WxCpKfAccountUpdDTO upd); void delete(WxCpKfAccountDel del); diff --git a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java index 4a1a759..b8e2634 100644 --- a/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java +++ b/yshop-module-mp/yshop-module-mp-biz/src/main/java/co/yixiang/yshop/module/mp/service/customerservice/CustomerServiceServiceImpl.java @@ -3,6 +3,8 @@ package co.yixiang.yshop.module.mp.service.customerservice; import co.yixiang.yshop.framework.common.pojo.PageParam; import co.yixiang.yshop.framework.common.pojo.PageResult; import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.CustomerServiceVO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.WxCpKfAccountAddDTO; +import co.yixiang.yshop.module.mp.controller.admin.customerservice.vo.WxCpKfAccountUpdDTO; import co.yixiang.yshop.module.mp.dal.dataobject.customerservice.CustomerServiceDO; import co.yixiang.yshop.module.mp.dal.mysql.customerservice.CustomerServiceMapper; import co.yixiang.yshop.module.mp.framework.cp.config.WxCpConfiguration; @@ -33,12 +35,13 @@ public class CustomerServiceServiceImpl implements CustomerServiceService { public PageResult page(PageParam pageParam) { WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); //客服列表 - PageResult page = mapper.selectPage(pageParam, Wrappers.emptyWrapper()); + PageResult page = mapper.selectPage(pageParam, Wrappers.lambdaQuery().orderByDesc(CustomerServiceDO::getId)); List collect = page.getList().stream().map(item -> { CustomerServiceVO customerServiceVO = new CustomerServiceVO(); customerServiceVO.setName(item.getName()); customerServiceVO.setAvatar(item.getAvatar()); customerServiceVO.setOpenKfid(item.getOpenKfid()); + customerServiceVO.setAvatarUrl(item.getAvatarUrl()); //客服链接 WxCpKfAccountLink link = new WxCpKfAccountLink(); link.setOpenKfid(item.getOpenKfid()); @@ -60,26 +63,28 @@ public class CustomerServiceServiceImpl implements CustomerServiceService { @Override @SneakyThrows - public WxCpKfAccountAddResp save(WxCpKfAccountAdd add) { + public WxCpKfAccountAddResp save(WxCpKfAccountAddDTO add) { WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); WxCpKfAccountAddResp wxCpKfAccountAddResp = kfService.addAccount(add); CustomerServiceDO customerServiceDO = new CustomerServiceDO(); customerServiceDO.setName(add.getName()); customerServiceDO.setAvatar(add.getMediaId()); customerServiceDO.setOpenKfid(wxCpKfAccountAddResp.getOpenKfid()); + customerServiceDO.setAvatarUrl(add.getAvatarUrl()); mapper.insert(customerServiceDO); return wxCpKfAccountAddResp; } @SneakyThrows @Override - public void update(WxCpKfAccountUpd upd) { + public void update(WxCpKfAccountUpdDTO upd) { WxCpKfService kfService = WxCpConfiguration.getCpService().getKfService(); WxCpBaseResp resp = kfService.updAccount(upd); CustomerServiceDO customerServiceDO = new CustomerServiceDO(); customerServiceDO.setName(upd.getName()); customerServiceDO.setAvatar(upd.getMediaId()); customerServiceDO.setOpenKfid(upd.getOpenKfid()); + customerServiceDO.setAvatarUrl(upd.getAvatarUrl()); mapper.update(customerServiceDO, Wrappers.lambdaUpdate().eq(CustomerServiceDO::getOpenKfid, upd.getOpenKfid())); }