202507031526

This commit is contained in:
张潘 2025-07-03 15:26:35 +08:00
parent 419e0f18a4
commit b3eeffe6ad
30 changed files with 3542 additions and 70 deletions

View File

@ -1814,14 +1814,16 @@ public class AppletController extends BaseController {
String content = (String) param.get("content");
Integer num = param.get("num") != null ? Integer.parseInt(param.get("num").toString()) : null;
Object imagesObj = param.get("images");
Object labels = param.get("labels");
if (orderId == null || orderId.isEmpty()) {
return AjaxResult.error("请选择评价的订单");
return AppletControllerUtil.appletWarning("请选择评价的订单");
}
if (content == null || content.isEmpty()) {
return AjaxResult.error("请输入评价内容");
return AppletControllerUtil.appletWarning("请输入评价内容");
}
if (num == null) {
return AjaxResult.error("请打分");
return AppletControllerUtil.appletWarning("请打分");
}
// 获取当前登录用户假设有token或session示例用1L
Long uid = 1L;
@ -1832,13 +1834,13 @@ public class AppletController extends BaseController {
query.setOrderId(orderId);
List<GoodsOrder> orderList = goodsOrderService.selectGoodsOrderList(query);
if (orderList == null || orderList.isEmpty()) {
return AjaxResult.error("订单不存在");
return AppletControllerUtil.appletWarning("订单不存在");
}
goodsOrder = orderList.get(0);
}
int count = orderCommentService.selectCountOrderCommentByOid(goodsOrder.getId());
if (count > 0) {
return AjaxResult.error("请勿重复提交");
return AppletControllerUtil.appletWarning("请勿重复提交");
}
// 评分类型
long numType = num == 1 ? 3 : ((num == 2 || num == 3) ? 2 : 1);
@ -1848,6 +1850,7 @@ public class AppletController extends BaseController {
comment.setOrderId(orderId);
comment.setProductId(goodsOrder.getProductId());
comment.setContent(content);
comment.setLabels(labels != null ? JSON.toJSONString(labels) : null );
comment.setNum((long) num);
comment.setUid(goodsOrder.getUid()); // 或uid
comment.setImages(imagesObj != null ? JSON.toJSONString(imagesObj) : null);
@ -1861,7 +1864,7 @@ public class AppletController extends BaseController {
goodsOrderService.updateGoodsOrder(goodsOrder);
return AjaxResult.success();
} else {
return AjaxResult.error("操作失败");
return AppletControllerUtil.appletWarning("操作失败");
}
}
/**
@ -6752,11 +6755,119 @@ public class AppletController extends BaseController {
/**
* 验证用户图像和昵称是否为系统默认
* 服务订单评价
*
* @param request HTTP请求对象
* @return 验证结果
*/
@PostMapping("/api/service/order/comment")
public AjaxResult serviceOrderComment(@RequestBody Map<String, Object> params, HttpServletRequest request) {
try {
// 1. 验证用户登录状态
String token = request.getHeader("token");
Map<String, Object> userValidation = AppletLoginUtil.validateUserToken(token, usersService);
if (!(Boolean) userValidation.get("valid")) {
return AppletControllerUtil.appletWarning("用户未登录或token无效");
}
// 2. 获取用户信息
Users user = (Users) userValidation.get("user");
if (user == null) {
return AppletControllerUtil.appletWarning("用户信息获取失败");
}
// 参数验证
if (!params.containsKey("order_id") || !params.containsKey("content") || !params.containsKey("num")) {
return AppletControllerUtil.appletWarning("参数错误");
}
String orderId = params.get("order_id").toString();
String content = params.get("content").toString();
Integer num = Integer.parseInt(params.get("num").toString());
//
// // 检查是否已经评价过
// OrderComment existComment = orderCommentService.selectOrderCommentByOrderIdAndUserId(orderId, user.getId());
// if (existComment != null) {
// return AjaxResult.error("请勿重复提交");
// }
// 获取订单信息
Order order = orderService.selectOrderByOrderId(orderId);
if (order == null) {
return AppletControllerUtil.appletWarning("订单不存在");
}
int count = orderCommentService.selectCountOrderCommentByOid(order.getId());
if (count > 0) {
return AppletControllerUtil.appletWarning("请勿重复提交");
}
// 计算评分类型
Integer numType;
if (num == 1) {
numType = 3; // 差评
} else if (num == 2 || num == 3) {
numType = 2; // 中评
} else {
numType = 1; // 好评
}
// 构建评价数据
OrderComment comment = new OrderComment();
comment.setOid(order.getId());
comment.setOrderId(orderId);
comment.setProductId(order.getProductId());
comment.setContent(content);
comment.setNum(Long.valueOf(num));
comment.setNumType(Long.valueOf(numType));
comment.setUid(user.getId());
comment.setWorkerId(order.getWorkerId());
// 处理图片
if (params.containsKey("images") && params.get("images") != null) {
String images = JSON.toJSONString(params.get("images"));
comment.setImages(images);
}
// 处理图片
if (params.containsKey("labels") && params.get("labels") != null) {
String labels = JSON.toJSONString(params.get("labels"));
comment.setLabels(labels);
}
try {
// 1. 保存评价
orderCommentService.insertOrderComment(comment);
// 2. 添加订单日志
OrderLog orderLog = new OrderLog();
orderLog.setOid(order.getId());
orderLog.setOrderId(orderId);
orderLog.setTitle("订单评价");
orderLog.setType(BigDecimal.valueOf(8));
Map<String, Object> logContent = new HashMap<>();
logContent.put("text", content);
logContent.put("image", params.get("images"));
logContent.put("num", num);
orderLog.setContent(JSON.toJSONString(logContent));
orderLogService.insertOrderLog(orderLog);
// 3. 更新订单状态
// Order updateOrder = new Order();
// order.setOrderId(orderId);
order.setStatus(4L); // 完成状态
order.setIsComment(1); // 已评价
orderService.updateOrder(order);
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.error("操作失败:" + e.getMessage());
}
} catch (Exception e) {
return AjaxResult.error("系统错误:" + e.getMessage());
}
}
@GetMapping("/api/user/check/default")
public AjaxResult checkUserDefault(HttpServletRequest request) {
try {

View File

@ -79,6 +79,19 @@ public class ServiceGoodsController extends BaseController {
}
/**
* 获取服务内容详细信息
*/
@PreAuthorize("@ss.hasPermi('system:ServiceGoods:query')")
@GetMapping(value = "/selectList")
public AjaxResult selectList() {
ServiceGoods serviceGoods = new ServiceGoods();
serviceGoods.setIsfixed(1);
return success(serviceGoodsService.selectServiceGoodsList(serviceGoods));
}
/**
* 获取服务内容详细信息
*/

View File

@ -0,0 +1,124 @@
package com.ruoyi.system.controller;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson2.JSONArray;
import com.ruoyi.system.ControllerUtil.GenerateCustomCode;
import com.ruoyi.system.domain.QuoteMaterial;
import com.ruoyi.system.service.IServiceGoodsService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
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;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.UserSecondaryCard;
import com.ruoyi.system.service.IUserSecondaryCardService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 次卡管理Controller
*
* @author ruoyi
* @date 2025-07-02
*/
@RestController
@RequestMapping("/system/UserSecondaryCard")
public class UserSecondaryCardController extends BaseController
{
@Autowired
private IUserSecondaryCardService userSecondaryCardService;
@Autowired
private IServiceGoodsService serviceGoodsService;
/**
* 查询次卡管理列表
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:list')")
@GetMapping("/list")
public TableDataInfo list(UserSecondaryCard userSecondaryCard)
{
startPage();
List<UserSecondaryCard> list = userSecondaryCardService.selectUserSecondaryCardList(userSecondaryCard);
JSONArray jsonArray = new JSONArray();
//JSONArray.parseArray(str);
for(UserSecondaryCard t:list){
List<String> idsList = com.alibaba.fastjson2.JSONArray.parseArray(t.getGoodsids(), String.class);
t.setGoodsname(serviceGoodsService.selectTitlesJSONArrayByIds(idsList));
}
return getDataTable(list);
}
/**
* 导出次卡管理列表
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:export')")
@Log(title = "次卡管理", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, UserSecondaryCard userSecondaryCard)
{
List<UserSecondaryCard> list = userSecondaryCardService.selectUserSecondaryCardList(userSecondaryCard);
ExcelUtil<UserSecondaryCard> util = new ExcelUtil<UserSecondaryCard>(UserSecondaryCard.class);
util.exportExcel(response, list, "次卡管理数据");
}
/**
* 获取次卡管理详细信息
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(userSecondaryCardService.selectUserSecondaryCardById(id));
}
/**
* 新增次卡管理
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:add')")
@Log(title = "次卡管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody UserSecondaryCard userSecondaryCard)
{
userSecondaryCard.setOrderid(GenerateCustomCode.generCreateOrder("CIKA"));
userSecondaryCard.setCreattime(new Date());
return toAjax(userSecondaryCardService.insertUserSecondaryCard(userSecondaryCard));
}
/**
* 修改次卡管理
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:edit')")
@Log(title = "次卡管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody UserSecondaryCard userSecondaryCard)
{
return toAjax(userSecondaryCardService.updateUserSecondaryCard(userSecondaryCard));
}
/**
* 删除次卡管理
*/
@PreAuthorize("@ss.hasPermi('system:UserSecondaryCard:remove')")
@Log(title = "次卡管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(userSecondaryCardService.deleteUserSecondaryCardByIds(ids));
}
}

View File

@ -0,0 +1,104 @@
package com.ruoyi.system.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
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;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.UserUseSecondaryCard;
import com.ruoyi.system.service.IUserUseSecondaryCardService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 次卡使用Controller
*
* @author ruoyi
* @date 2025-07-02
*/
@RestController
@RequestMapping("/system/UserUseSecondaryCard")
public class UserUseSecondaryCardController extends BaseController
{
@Autowired
private IUserUseSecondaryCardService userUseSecondaryCardService;
/**
* 查询次卡使用列表
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:list')")
@GetMapping("/list")
public TableDataInfo list(UserUseSecondaryCard userUseSecondaryCard)
{
startPage();
List<UserUseSecondaryCard> list = userUseSecondaryCardService.selectUserUseSecondaryCardList(userUseSecondaryCard);
return getDataTable(list);
}
/**
* 导出次卡使用列表
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:export')")
@Log(title = "次卡使用", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, UserUseSecondaryCard userUseSecondaryCard)
{
List<UserUseSecondaryCard> list = userUseSecondaryCardService.selectUserUseSecondaryCardList(userUseSecondaryCard);
ExcelUtil<UserUseSecondaryCard> util = new ExcelUtil<UserUseSecondaryCard>(UserUseSecondaryCard.class);
util.exportExcel(response, list, "次卡使用数据");
}
/**
* 获取次卡使用详细信息
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
return success(userUseSecondaryCardService.selectUserUseSecondaryCardById(id));
}
/**
* 新增次卡使用
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:add')")
@Log(title = "次卡使用", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody UserUseSecondaryCard userUseSecondaryCard)
{
return toAjax(userUseSecondaryCardService.insertUserUseSecondaryCard(userUseSecondaryCard));
}
/**
* 修改次卡使用
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:edit')")
@Log(title = "次卡使用", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody UserUseSecondaryCard userUseSecondaryCard)
{
return toAjax(userUseSecondaryCardService.updateUserUseSecondaryCard(userUseSecondaryCard));
}
/**
* 删除次卡使用
*/
@PreAuthorize("@ss.hasPermi('system:UserUseSecondaryCard:remove')")
@Log(title = "次卡使用", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
{
return toAjax(userUseSecondaryCardService.deleteUserUseSecondaryCardByIds(ids));
}
}

View File

@ -45,6 +45,10 @@ public class OrderComment extends BaseEntity
@Excel(name = "图片")
private String images;
/** 图片 */
@Excel(name = "评价标签")
private String labels;
/** 评价内容 */
@Excel(name = "评价内容")
private String content;
@ -212,6 +216,15 @@ public class OrderComment extends BaseEntity
this.uname = uname;
}
public String getLabels() {
return labels;
}
public void setLabels(String labels) {
this.labels = labels;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -65,6 +65,11 @@ public class ServiceGoods extends BaseEntity
@Excel(name = "详情")
private String description;
/** 规格类型 1单规格 2多规格 */
@Excel(name = "下单类型 1预约下单 2报价下单")
private Integer servicetype;
/** 规格类型 1单规格 2多规格 */
@Excel(name = "规格类型 1单规格 2多规格")
private Integer skuType;
@ -168,6 +173,10 @@ private String cateName;
private Integer groupnum;
/** 指定工人的id集合 */
@Excel(name = "问答")
private String questions;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
@ -597,6 +606,22 @@ private String cateName;
this.groupnum = groupnum;
}
public Integer getServicetype() {
return servicetype;
}
public void setServicetype(Integer servicetype) {
this.servicetype = servicetype;
}
public String getQuestions() {
return questions;
}
public void setQuestions(String questions) {
this.questions = questions;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

View File

@ -0,0 +1,249 @@
package com.ruoyi.system.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 次卡管理对象 user_secondary_card
*
* @author ruoyi
* @date 2025-07-02
*/
public class UserSecondaryCard extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 订单id */
@Excel(name = "订单id")
private String orderid;
/** 标题 */
@Excel(name = "标题")
private String title;
/** 服务id */
@Excel(name = "服务id")
private String goodsids;
/** 服务id */
@Excel(name = "服务名称")
private String goodsname;
/** 展示价格 */
@Excel(name = "展示价格")
private BigDecimal showMoney;
/** 真实付款价格 */
@Excel(name = "真实付款价格")
private BigDecimal realMoney;
/** 展示图片 */
@Excel(name = "展示图片")
private String showimage;
/** 状态 1上线 2下线 */
@Excel(name = "状态 1上线 2下线")
private Long status;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date creattime;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Date createdAt;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Date updatedAt;
/** 分类 */
@Excel(name = "分类")
private Long type;
/** 可提供服务数 */
@Excel(name = "可提供服务数")
private Long num;
/** 总服务数 */
@Excel(name = "总服务数")
private Long allnum;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setOrderid(String orderid)
{
this.orderid = orderid;
}
public String getOrderid()
{
return orderid;
}
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return title;
}
public void setGoodsids(String goodsids)
{
this.goodsids = goodsids;
}
public String getGoodsids()
{
return goodsids;
}
public void setShowMoney(BigDecimal showMoney)
{
this.showMoney = showMoney;
}
public BigDecimal getShowMoney()
{
return showMoney;
}
public void setRealMoney(BigDecimal realMoney)
{
this.realMoney = realMoney;
}
public BigDecimal getRealMoney()
{
return realMoney;
}
public void setShowimage(String showimage)
{
this.showimage = showimage;
}
public String getShowimage()
{
return showimage;
}
public void setStatus(Long status)
{
this.status = status;
}
public Long getStatus()
{
return status;
}
public void setCreattime(Date creattime)
{
this.creattime = creattime;
}
public Date getCreattime()
{
return creattime;
}
public void setCreatedAt(Date createdAt)
{
this.createdAt = createdAt;
}
public Date getCreatedAt()
{
return createdAt;
}
public void setUpdatedAt(Date updatedAt)
{
this.updatedAt = updatedAt;
}
public Date getUpdatedAt()
{
return updatedAt;
}
public void setType(Long type)
{
this.type = type;
}
public Long getType()
{
return type;
}
public void setNum(Long num)
{
this.num = num;
}
public Long getNum()
{
return num;
}
public void setAllnum(Long allnum)
{
this.allnum = allnum;
}
public Long getAllnum()
{
return allnum;
}
public String getGoodsname() {
return goodsname;
}
public void setGoodsname(String goodsname) {
this.goodsname = goodsname;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("orderid", getOrderid())
.append("title", getTitle())
.append("goodsids", getGoodsids())
.append("showMoney", getShowMoney())
.append("realMoney", getRealMoney())
.append("showimage", getShowimage())
.append("status", getStatus())
.append("creattime", getCreattime())
.append("createdAt", getCreatedAt())
.append("updatedAt", getUpdatedAt())
.append("type", getType())
.append("num", getNum())
.append("allnum", getAllnum())
.toString();
}
}

View File

@ -0,0 +1,205 @@
package com.ruoyi.system.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 次卡使用对象 user_use_secondary_card
*
* @author ruoyi
* @date 2025-07-02
*/
public class UserUseSecondaryCard extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 用户id */
@Excel(name = "用户id")
private Long uid;
/** 次卡id */
@Excel(name = "次卡id")
private String carid;
/** 服务id */
@Excel(name = "服务id")
private String goodsids;
/** 用户可用数量 */
@Excel(name = "用户可用数量")
private Long num;
/** 用户已用数量 */
@Excel(name = "用户已用数量")
private Long usenum;
/** 订单id */
@Excel(name = "订单id")
private String orderid;
/** 支付id */
@Excel(name = "支付id")
private String transactionId;
/** 支付金额 */
@Excel(name = "支付金额")
private BigDecimal paymoney;
/** 状态 1可用 2已用完 3已退款 */
@Excel(name = "状态 1可用 2已用完 3已退款")
private Long status;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Date createdAt;
/** $column.columnComment */
@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
private Date updatedAt;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setUid(Long uid)
{
this.uid = uid;
}
public Long getUid()
{
return uid;
}
public void setCarid(String carid)
{
this.carid = carid;
}
public String getCarid()
{
return carid;
}
public void setGoodsids(String goodsids)
{
this.goodsids = goodsids;
}
public String getGoodsids()
{
return goodsids;
}
public void setNum(Long num)
{
this.num = num;
}
public Long getNum()
{
return num;
}
public void setUsenum(Long usenum)
{
this.usenum = usenum;
}
public Long getUsenum()
{
return usenum;
}
public void setOrderid(String orderid)
{
this.orderid = orderid;
}
public String getOrderid()
{
return orderid;
}
public void setTransactionId(String transactionId)
{
this.transactionId = transactionId;
}
public String getTransactionId()
{
return transactionId;
}
public void setPaymoney(BigDecimal paymoney)
{
this.paymoney = paymoney;
}
public BigDecimal getPaymoney()
{
return paymoney;
}
public void setStatus(Long status)
{
this.status = status;
}
public Long getStatus()
{
return status;
}
public void setCreatedAt(Date createdAt)
{
this.createdAt = createdAt;
}
public Date getCreatedAt()
{
return createdAt;
}
public void setUpdatedAt(Date updatedAt)
{
this.updatedAt = updatedAt;
}
public Date getUpdatedAt()
{
return updatedAt;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("uid", getUid())
.append("carid", getCarid())
.append("goodsids", getGoodsids())
.append("num", getNum())
.append("usenum", getUsenum())
.append("orderid", getOrderid())
.append("transactionId", getTransactionId())
.append("paymoney", getPaymoney())
.append("status", getStatus())
.append("createdAt", getCreatedAt())
.append("updatedAt", getUpdatedAt())
.toString();
}
}

View File

@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.alibaba.fastjson2.JSONArray;
import com.ruoyi.system.domain.ServiceGoods;
import org.apache.ibatis.annotations.Param;
@ -22,6 +24,15 @@ public interface ServiceGoodsMapper
public String selectTitlesJSONArrayByIds(@Param("ids") List<String> ids);
public List<ServiceGoods> selectServiceGoodsfrocikaList(@Param("ids") List<String> ids);
public String selectTitlesByIds(@Param("ids") List<String> ids);
/**
* 查询服务内容列表

View File

@ -0,0 +1,61 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.UserSecondaryCard;
/**
* 次卡管理Mapper接口
*
* @author ruoyi
* @date 2025-07-02
*/
public interface UserSecondaryCardMapper
{
/**
* 查询次卡管理
*
* @param id 次卡管理主键
* @return 次卡管理
*/
public UserSecondaryCard selectUserSecondaryCardById(Long id);
/**
* 查询次卡管理列表
*
* @param userSecondaryCard 次卡管理
* @return 次卡管理集合
*/
public List<UserSecondaryCard> selectUserSecondaryCardList(UserSecondaryCard userSecondaryCard);
/**
* 新增次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
public int insertUserSecondaryCard(UserSecondaryCard userSecondaryCard);
/**
* 修改次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
public int updateUserSecondaryCard(UserSecondaryCard userSecondaryCard);
/**
* 删除次卡管理
*
* @param id 次卡管理主键
* @return 结果
*/
public int deleteUserSecondaryCardById(Long id);
/**
* 批量删除次卡管理
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteUserSecondaryCardByIds(Long[] ids);
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.system.mapper;
import java.util.List;
import com.ruoyi.system.domain.UserUseSecondaryCard;
/**
* 次卡使用Mapper接口
*
* @author ruoyi
* @date 2025-07-02
*/
public interface UserUseSecondaryCardMapper
{
/**
* 查询次卡使用
*
* @param id 次卡使用主键
* @return 次卡使用
*/
public UserUseSecondaryCard selectUserUseSecondaryCardById(Long id);
/**
* 查询次卡使用列表
*
* @param userUseSecondaryCard 次卡使用
* @return 次卡使用集合
*/
public List<UserUseSecondaryCard> selectUserUseSecondaryCardList(UserUseSecondaryCard userUseSecondaryCard);
/**
* 新增次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
public int insertUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard);
/**
* 修改次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
public int updateUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard);
/**
* 删除次卡使用
*
* @param id 次卡使用主键
* @return 结果
*/
public int deleteUserUseSecondaryCardById(Long id);
/**
* 批量删除次卡使用
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteUserUseSecondaryCardByIds(Long[] ids);
}

View File

@ -1,6 +1,8 @@
package com.ruoyi.system.service;
import java.util.List;
import com.alibaba.fastjson2.JSONArray;
import com.ruoyi.system.domain.ServiceGoods;
import org.apache.ibatis.annotations.Param;
@ -37,6 +39,18 @@ public interface IServiceGoodsService
public String selectTitlesByIds(List<String> ids);
/**
* 查询服务内容列表
*
* @param ids 服务内容
* @return 服务内容集合
*/
public String selectTitlesJSONArrayByIds(List<String> ids);
public List<ServiceGoods> selectServiceGoodsfrocikaList(List<String> ids);
/**
* 新增服务内容
*

View File

@ -0,0 +1,61 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.UserSecondaryCard;
/**
* 次卡管理Service接口
*
* @author ruoyi
* @date 2025-07-02
*/
public interface IUserSecondaryCardService
{
/**
* 查询次卡管理
*
* @param id 次卡管理主键
* @return 次卡管理
*/
public UserSecondaryCard selectUserSecondaryCardById(Long id);
/**
* 查询次卡管理列表
*
* @param userSecondaryCard 次卡管理
* @return 次卡管理集合
*/
public List<UserSecondaryCard> selectUserSecondaryCardList(UserSecondaryCard userSecondaryCard);
/**
* 新增次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
public int insertUserSecondaryCard(UserSecondaryCard userSecondaryCard);
/**
* 修改次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
public int updateUserSecondaryCard(UserSecondaryCard userSecondaryCard);
/**
* 批量删除次卡管理
*
* @param ids 需要删除的次卡管理主键集合
* @return 结果
*/
public int deleteUserSecondaryCardByIds(Long[] ids);
/**
* 删除次卡管理信息
*
* @param id 次卡管理主键
* @return 结果
*/
public int deleteUserSecondaryCardById(Long id);
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.system.service;
import java.util.List;
import com.ruoyi.system.domain.UserUseSecondaryCard;
/**
* 次卡使用Service接口
*
* @author ruoyi
* @date 2025-07-02
*/
public interface IUserUseSecondaryCardService
{
/**
* 查询次卡使用
*
* @param id 次卡使用主键
* @return 次卡使用
*/
public UserUseSecondaryCard selectUserUseSecondaryCardById(Long id);
/**
* 查询次卡使用列表
*
* @param userUseSecondaryCard 次卡使用
* @return 次卡使用集合
*/
public List<UserUseSecondaryCard> selectUserUseSecondaryCardList(UserUseSecondaryCard userUseSecondaryCard);
/**
* 新增次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
public int insertUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard);
/**
* 修改次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
public int updateUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard);
/**
* 批量删除次卡使用
*
* @param ids 需要删除的次卡使用主键集合
* @return 结果
*/
public int deleteUserUseSecondaryCardByIds(Long[] ids);
/**
* 删除次卡使用信息
*
* @param id 次卡使用主键
* @return 结果
*/
public int deleteUserUseSecondaryCardById(Long id);
}

View File

@ -2,6 +2,7 @@ package com.ruoyi.system.service.impl;
import java.util.List;
import com.alibaba.fastjson2.JSONArray;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -55,6 +56,22 @@ public class ServiceGoodsServiceImpl implements IServiceGoodsService
return serviceGoodsMapper.selectServiceGoodsList(serviceGoods);
}
/**
* 查询服务内容列表
*
* @param ids 服务内容
* @return 服务内容集合
*/
@Override
public String selectTitlesJSONArrayByIds(List<String> ids){
return serviceGoodsMapper.selectTitlesJSONArrayByIds(ids);
}
public List<ServiceGoods> selectServiceGoodsfrocikaList(List<String> ids) {
return serviceGoodsMapper.selectServiceGoodsfrocikaList(ids);
}
/**
* 新增服务内容
*

View File

@ -0,0 +1,93 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UserSecondaryCardMapper;
import com.ruoyi.system.domain.UserSecondaryCard;
import com.ruoyi.system.service.IUserSecondaryCardService;
/**
* 次卡管理Service业务层处理
*
* @author ruoyi
* @date 2025-07-02
*/
@Service
public class UserSecondaryCardServiceImpl implements IUserSecondaryCardService
{
@Autowired
private UserSecondaryCardMapper userSecondaryCardMapper;
/**
* 查询次卡管理
*
* @param id 次卡管理主键
* @return 次卡管理
*/
@Override
public UserSecondaryCard selectUserSecondaryCardById(Long id)
{
return userSecondaryCardMapper.selectUserSecondaryCardById(id);
}
/**
* 查询次卡管理列表
*
* @param userSecondaryCard 次卡管理
* @return 次卡管理
*/
@Override
public List<UserSecondaryCard> selectUserSecondaryCardList(UserSecondaryCard userSecondaryCard)
{
return userSecondaryCardMapper.selectUserSecondaryCardList(userSecondaryCard);
}
/**
* 新增次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
@Override
public int insertUserSecondaryCard(UserSecondaryCard userSecondaryCard)
{
return userSecondaryCardMapper.insertUserSecondaryCard(userSecondaryCard);
}
/**
* 修改次卡管理
*
* @param userSecondaryCard 次卡管理
* @return 结果
*/
@Override
public int updateUserSecondaryCard(UserSecondaryCard userSecondaryCard)
{
return userSecondaryCardMapper.updateUserSecondaryCard(userSecondaryCard);
}
/**
* 批量删除次卡管理
*
* @param ids 需要删除的次卡管理主键
* @return 结果
*/
@Override
public int deleteUserSecondaryCardByIds(Long[] ids)
{
return userSecondaryCardMapper.deleteUserSecondaryCardByIds(ids);
}
/**
* 删除次卡管理信息
*
* @param id 次卡管理主键
* @return 结果
*/
@Override
public int deleteUserSecondaryCardById(Long id)
{
return userSecondaryCardMapper.deleteUserSecondaryCardById(id);
}
}

View File

@ -0,0 +1,93 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.UserUseSecondaryCardMapper;
import com.ruoyi.system.domain.UserUseSecondaryCard;
import com.ruoyi.system.service.IUserUseSecondaryCardService;
/**
* 次卡使用Service业务层处理
*
* @author ruoyi
* @date 2025-07-02
*/
@Service
public class UserUseSecondaryCardServiceImpl implements IUserUseSecondaryCardService
{
@Autowired
private UserUseSecondaryCardMapper userUseSecondaryCardMapper;
/**
* 查询次卡使用
*
* @param id 次卡使用主键
* @return 次卡使用
*/
@Override
public UserUseSecondaryCard selectUserUseSecondaryCardById(Long id)
{
return userUseSecondaryCardMapper.selectUserUseSecondaryCardById(id);
}
/**
* 查询次卡使用列表
*
* @param userUseSecondaryCard 次卡使用
* @return 次卡使用
*/
@Override
public List<UserUseSecondaryCard> selectUserUseSecondaryCardList(UserUseSecondaryCard userUseSecondaryCard)
{
return userUseSecondaryCardMapper.selectUserUseSecondaryCardList(userUseSecondaryCard);
}
/**
* 新增次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
@Override
public int insertUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard)
{
return userUseSecondaryCardMapper.insertUserUseSecondaryCard(userUseSecondaryCard);
}
/**
* 修改次卡使用
*
* @param userUseSecondaryCard 次卡使用
* @return 结果
*/
@Override
public int updateUserUseSecondaryCard(UserUseSecondaryCard userUseSecondaryCard)
{
return userUseSecondaryCardMapper.updateUserUseSecondaryCard(userUseSecondaryCard);
}
/**
* 批量删除次卡使用
*
* @param ids 需要删除的次卡使用主键
* @return 结果
*/
@Override
public int deleteUserUseSecondaryCardByIds(Long[] ids)
{
return userUseSecondaryCardMapper.deleteUserUseSecondaryCardByIds(ids);
}
/**
* 删除次卡使用信息
*
* @param id 次卡使用主键
* @return 结果
*/
@Override
public int deleteUserUseSecondaryCardById(Long id)
{
return userUseSecondaryCardMapper.deleteUserUseSecondaryCardById(id);
}
}

View File

@ -16,12 +16,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="numType" column="num_type" />
<result property="status" column="status" />
<result property="workerId" column="worker_id" />
<result property="labels" column="labels" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
</resultMap>
<sql id="selectOrderCommentVo">
select id, oid, order_id, product_id, uid, images, content, num, num_type, status, worker_id, created_at, updated_at from order_comment
select id, oid, order_id, product_id, uid, images, content, num, num_type, status,labels, worker_id, created_at, updated_at from order_comment
</sql>
<select id="selectCountOrderCommentByOid" parameterType="Long" resultType="Integer">
select count(0) from order_comment where oid= #{oid}
@ -67,6 +69,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="numType != null">num_type,</if>
<if test="status != null">status,</if>
<if test="workerId != null">worker_id,</if>
<if test="labels != null">labels,</if>
created_at,
updated_at
</trim>
@ -81,6 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="numType != null">#{numType},</if>
<if test="status != null">#{status},</if>
<if test="workerId != null">#{workerId},</if>
<if test="labels != null">#{labels},</if>
NOW(),
NOW()
</trim>
@ -96,6 +101,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="images != null">images = #{images},</if>
<if test="content != null and content != ''">content = #{content},</if>
<if test="num != null">num = #{num},</if>
<if test="labels != null">labels = #{labels},</if>
<if test="numType != null">num_type = #{numType},</if>
<if test="status != null">status = #{status},</if>
<if test="workerId != null">worker_id = #{workerId},</if>

View File

@ -20,6 +20,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="description" column="description" />
<result property="skuType" column="sku_type" />
<result property="sku" column="sku" />
<result property="servicetype" column="servicetype" />
<result property="questions" column="questions" />
<result property="latitude" column="latitude" />
<result property="longitude" column="longitude" />
<result property="type" column="type" />
@ -47,7 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectServiceGoodsVo">
select id, title, icon, imgs, sub_title, info, price, price_zn, sales, stock, status, description, sku_type,groupnum,sku, latitude, longitude, type, cate_id, project, sort, material, postage, basic, margin, skill_ids, created_at, updated_at, deleted_at, isgroup, groupprice, isonce, onceprice, commissiontype, commission, dispatchtype, workerids, isfixed, fixedprice from service_goods
select id, title, icon, imgs, sub_title, info, price,questions, price_zn, sales,servicetype, stock, status, description, sku_type,groupnum,sku, latitude, longitude, type, cate_id, project, sort, material, postage, basic, margin, skill_ids, created_at, updated_at, deleted_at, isgroup, groupprice, isonce, onceprice, commissiontype, commission, dispatchtype, workerids, isfixed, fixedprice from service_goods
</sql>
<select id="selectServiceGoodsList" parameterType="ServiceGoods" resultMap="ServiceGoodsResult">
@ -69,6 +73,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
order by id desc
</select>
<select id="selectServiceGoodsfrocikaList" parameterType="java.util.List" resultMap="ServiceGoodsResult">
<include refid="selectServiceGoodsVo"/>
id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
order by created_at desc
</select>
<select id="selectTitlesByIds" parameterType="list" resultType="string">
SELECT GROUP_CONCAT(title SEPARATOR '|') FROM service_goods
WHERE id IN
@ -77,6 +95,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</select>
<select id="selectTitlesJSONArrayByIds" parameterType="java.util.List" resultType="string">
SELECT GROUP_CONCAT(title SEPARATOR '|') FROM service_goods
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="selectServiceGoodsById" parameterType="Long" resultMap="ServiceGoodsResult">
<include refid="selectServiceGoodsVo"/>
where id = #{id}
@ -122,6 +149,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="isfixed != null">isfixed,</if>
<if test="fixedprice != null">fixedprice,</if>
<if test="groupnum != null">groupnum,</if>
<if test="servicetype != null">servicetype,</if>
<if test="questions != null">questions,</if>
created_at,
updated_at
@ -164,8 +193,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="isfixed != null">#{isfixed},</if>
<if test="fixedprice != null">#{fixedprice},</if>
<if test="groupnum != null">#{groupnum},</if>
<if test="servicetype != null">#{servicetype},</if>
<if test="questions != null">#{questions},</if>
NOW(),
NOW()
@ -204,6 +233,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="groupprice != null">groupprice = #{groupprice},</if>
<if test="isonce != null">isonce = #{isonce},</if>
<if test="onceprice != null">onceprice = #{onceprice},</if>
<if test="servicetype != null">servicetype = #{servicetype},</if>
<if test="questions != null">questions = #{questions},</if>
<if test="commissiontype != null">commissiontype = #{commissiontype},</if>
<if test="commission != null">commission = #{commission},</if>
<if test="dispatchtype != null">dispatchtype = #{dispatchtype},</if>

View File

@ -0,0 +1,116 @@
<?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.system.mapper.UserSecondaryCardMapper">
<resultMap type="UserSecondaryCard" id="UserSecondaryCardResult">
<result property="id" column="id" />
<result property="orderid" column="orderid" />
<result property="title" column="title" />
<result property="goodsids" column="goodsids" />
<result property="showMoney" column="show_money" />
<result property="realMoney" column="real_money" />
<result property="showimage" column="showimage" />
<result property="status" column="status" />
<result property="creattime" column="creattime" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
<result property="type" column="type" />
<result property="num" column="num" />
<result property="allnum" column="allnum" />
</resultMap>
<sql id="selectUserSecondaryCardVo">
select id, orderid, title, goodsids, show_money, real_money, showimage, status, creattime, created_at, updated_at, type, num, allnum from user_secondary_card
</sql>
<select id="selectUserSecondaryCardList" parameterType="UserSecondaryCard" resultMap="UserSecondaryCardResult">
<include refid="selectUserSecondaryCardVo"/>
<where>
<if test="orderid != null and orderid != ''"> and orderid = #{orderid}</if>
<if test="title != null and title != ''"> and title = #{title}</if>
<if test="goodsids != null and goodsids != ''"> and goodsids = #{goodsids}</if>
<if test="showMoney != null "> and show_money = #{showMoney}</if>
<if test="realMoney != null "> and real_money = #{realMoney}</if>
<if test="showimage != null and showimage != ''"> and showimage = #{showimage}</if>
<if test="status != null "> and status = #{status}</if>
<if test="creattime != null "> and creattime = #{creattime}</if>
<if test="createdAt != null "> and created_at = #{createdAt}</if>
<if test="updatedAt != null "> and updated_at = #{updatedAt}</if>
<if test="type != null "> and type = #{type}</if>
<if test="num != null "> and num = #{num}</if>
<if test="allnum != null "> and allnum = #{allnum}</if>
</where>
</select>
<select id="selectUserSecondaryCardById" parameterType="Long" resultMap="UserSecondaryCardResult">
<include refid="selectUserSecondaryCardVo"/>
where id = #{id}
</select>
<insert id="insertUserSecondaryCard" parameterType="UserSecondaryCard">
insert into user_secondary_card
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="orderid != null">orderid,</if>
<if test="title != null">title,</if>
<if test="goodsids != null">goodsids,</if>
<if test="showMoney != null">show_money,</if>
<if test="realMoney != null">real_money,</if>
<if test="showimage != null">showimage,</if>
<if test="status != null">status,</if>
<if test="creattime != null">creattime,</if>
<if test="createdAt != null">created_at,</if>
<if test="updatedAt != null">updated_at,</if>
<if test="type != null">type,</if>
<if test="num != null">num,</if>
<if test="allnum != null">allnum,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="orderid != null">#{orderid},</if>
<if test="title != null">#{title},</if>
<if test="goodsids != null">#{goodsids},</if>
<if test="showMoney != null">#{showMoney},</if>
<if test="realMoney != null">#{realMoney},</if>
<if test="showimage != null">#{showimage},</if>
<if test="status != null">#{status},</if>
<if test="creattime != null">#{creattime},</if>
<if test="createdAt != null">#{createdAt},</if>
<if test="updatedAt != null">#{updatedAt},</if>
<if test="type != null">#{type},</if>
<if test="num != null">#{num},</if>
<if test="allnum != null">#{allnum},</if>
</trim>
</insert>
<update id="updateUserSecondaryCard" parameterType="UserSecondaryCard">
update user_secondary_card
<trim prefix="SET" suffixOverrides=",">
<if test="orderid != null">orderid = #{orderid},</if>
<if test="title != null">title = #{title},</if>
<if test="goodsids != null">goodsids = #{goodsids},</if>
<if test="showMoney != null">show_money = #{showMoney},</if>
<if test="realMoney != null">real_money = #{realMoney},</if>
<if test="showimage != null">showimage = #{showimage},</if>
<if test="status != null">status = #{status},</if>
<if test="creattime != null">creattime = #{creattime},</if>
<if test="createdAt != null">created_at = #{createdAt},</if>
<if test="updatedAt != null">updated_at = #{updatedAt},</if>
<if test="type != null">type = #{type},</if>
<if test="num != null">num = #{num},</if>
<if test="allnum != null">allnum = #{allnum},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteUserSecondaryCardById" parameterType="Long">
delete from user_secondary_card where id = #{id}
</delete>
<delete id="deleteUserSecondaryCardByIds" parameterType="String">
delete from user_secondary_card where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,106 @@
<?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.system.mapper.UserUseSecondaryCardMapper">
<resultMap type="UserUseSecondaryCard" id="UserUseSecondaryCardResult">
<result property="id" column="id" />
<result property="uid" column="uid" />
<result property="carid" column="carid" />
<result property="goodsids" column="goodsids" />
<result property="num" column="num" />
<result property="usenum" column="usenum" />
<result property="orderid" column="orderid" />
<result property="transactionId" column="transaction_id" />
<result property="paymoney" column="paymoney" />
<result property="status" column="status" />
<result property="createdAt" column="created_at" />
<result property="updatedAt" column="updated_at" />
</resultMap>
<sql id="selectUserUseSecondaryCardVo">
select id, uid, carid, goodsids, num, usenum, orderid, transaction_id, paymoney, status, created_at, updated_at from user_use_secondary_card
</sql>
<select id="selectUserUseSecondaryCardList" parameterType="UserUseSecondaryCard" resultMap="UserUseSecondaryCardResult">
<include refid="selectUserUseSecondaryCardVo"/>
<where>
<if test="uid != null "> and uid = #{uid}</if>
<if test="carid != null and carid != ''"> and carid = #{carid}</if>
<if test="goodsids != null and goodsids != ''"> and goodsids = #{goodsids}</if>
<if test="num != null "> and num = #{num}</if>
<if test="usenum != null "> and usenum = #{usenum}</if>
<if test="orderid != null and orderid != ''"> and orderid = #{orderid}</if>
<if test="transactionId != null and transactionId != ''"> and transaction_id = #{transactionId}</if>
<if test="paymoney != null "> and paymoney = #{paymoney}</if>
<if test="status != null "> and status = #{status}</if>
<if test="createdAt != null "> and created_at = #{createdAt}</if>
<if test="updatedAt != null "> and updated_at = #{updatedAt}</if>
</where>
</select>
<select id="selectUserUseSecondaryCardById" parameterType="Long" resultMap="UserUseSecondaryCardResult">
<include refid="selectUserUseSecondaryCardVo"/>
where id = #{id}
</select>
<insert id="insertUserUseSecondaryCard" parameterType="UserUseSecondaryCard" useGeneratedKeys="true" keyProperty="id">
insert into user_use_secondary_card
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="uid != null">uid,</if>
<if test="carid != null">carid,</if>
<if test="goodsids != null">goodsids,</if>
<if test="num != null">num,</if>
<if test="usenum != null">usenum,</if>
<if test="orderid != null">orderid,</if>
<if test="transactionId != null">transaction_id,</if>
<if test="paymoney != null">paymoney,</if>
<if test="status != null">status,</if>
<if test="createdAt != null">created_at,</if>
<if test="updatedAt != null">updated_at,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="uid != null">#{uid},</if>
<if test="carid != null">#{carid},</if>
<if test="goodsids != null">#{goodsids},</if>
<if test="num != null">#{num},</if>
<if test="usenum != null">#{usenum},</if>
<if test="orderid != null">#{orderid},</if>
<if test="transactionId != null">#{transactionId},</if>
<if test="paymoney != null">#{paymoney},</if>
<if test="status != null">#{status},</if>
<if test="createdAt != null">#{createdAt},</if>
<if test="updatedAt != null">#{updatedAt},</if>
</trim>
</insert>
<update id="updateUserUseSecondaryCard" parameterType="UserUseSecondaryCard">
update user_use_secondary_card
<trim prefix="SET" suffixOverrides=",">
<if test="uid != null">uid = #{uid},</if>
<if test="carid != null">carid = #{carid},</if>
<if test="goodsids != null">goodsids = #{goodsids},</if>
<if test="num != null">num = #{num},</if>
<if test="usenum != null">usenum = #{usenum},</if>
<if test="orderid != null">orderid = #{orderid},</if>
<if test="transactionId != null">transaction_id = #{transactionId},</if>
<if test="paymoney != null">paymoney = #{paymoney},</if>
<if test="status != null">status = #{status},</if>
<if test="createdAt != null">created_at = #{createdAt},</if>
<if test="updatedAt != null">updated_at = #{updatedAt},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteUserUseSecondaryCardById" parameterType="Long">
delete from user_use_secondary_card where id = #{id}
</delete>
<delete id="deleteUserUseSecondaryCardByIds" parameterType="String">
delete from user_use_secondary_card where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,70 @@
import request from '@/utils/request'
// 查询次卡管理列表
export function listUserSecondaryCard(query) {
return request({
url: '/system/UserSecondaryCard/list',
method: 'get',
params: query
})
}
// 查询服务内容详细
export function getServiceGoods(id) {
return request({
url: '/system/ServiceGoods/' + id,
method: 'get'
})
}
// 查询服务内容详细
export function selectList() {
return request({
url: '/system/ServiceGoods/selectList',
method: 'get'
})
}
// 查询服务内容详细
export function selectServiceCateList() {
return request({
url: '/system/ServiceGoods/selectServiceCateList',
method: 'get'
})
}
// 查询次卡管理详细
export function getUserSecondaryCard(id) {
return request({
url: '/system/UserSecondaryCard/' + id,
method: 'get'
})
}
// 新增次卡管理
export function addUserSecondaryCard(data) {
return request({
url: '/system/UserSecondaryCard',
method: 'post',
data: data
})
}
// 修改次卡管理
export function updateUserSecondaryCard(data) {
return request({
url: '/system/UserSecondaryCard',
method: 'put',
data: data
})
}
// 删除次卡管理
export function delUserSecondaryCard(id) {
return request({
url: '/system/UserSecondaryCard/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询次卡使用列表
export function listUserUseSecondaryCard(query) {
return request({
url: '/system/UserUseSecondaryCard/list',
method: 'get',
params: query
})
}
// 查询次卡使用详细
export function getUserUseSecondaryCard(id) {
return request({
url: '/system/UserUseSecondaryCard/' + id,
method: 'get'
})
}
// 新增次卡使用
export function addUserUseSecondaryCard(data) {
return request({
url: '/system/UserUseSecondaryCard',
method: 'post',
data: data
})
}
// 修改次卡使用
export function updateUserUseSecondaryCard(data) {
return request({
url: '/system/UserUseSecondaryCard',
method: 'put',
data: data
})
}
// 删除次卡使用
export function delUserUseSecondaryCard(id) {
return request({
url: '/system/UserUseSecondaryCard/' + id,
method: 'delete'
})
}

View File

@ -0,0 +1,159 @@
<template>
<div>
<div @click="openDialog" style="cursor:pointer;">
<el-input
v-model="displayNames"
:placeholder="placeholder"
readonly
:clearable="clearable"
@clear="clearSelection"
>
<template slot="suffix">
<i class="el-icon-search"></i>
</template>
</el-input>
</div>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="900px" append-to-body>
<el-form :model="queryParams" :inline="true" label-width="60px">
<el-form-item label="标题">
<el-input v-model="queryParams.title" placeholder="请输入标题" clearable size="small" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="serviceList"
@selection-change="handleSelectionChange"
:row-key="row=>row.id"
:default-selection="defaultSelection"
style="width: 100%; margin-top: 15px;"
max-height="400px"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" prop="id" width="60" align="center" />
<el-table-column label="标题" prop="title" min-width="120" />
<el-table-column label="价格" prop="price" width="80" align="center" />
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
style="margin-top: 15px; margin-bottom: 10px;"
class="text-center"
/>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmSelection"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { listServiceGoods } from '@/api/system/ServiceGoods'
export default {
name: 'ServiceGoodsSelect',
props: {
value: {
type: [Array, String],
default: () => []
},
placeholder: {
type: String,
default: '请选择服务项目'
},
clearable: {
type: Boolean,
default: true
},
dialogTitle: {
type: String,
default: '选择服务项目'
}
},
data() {
return {
dialogVisible: false,
loading: false,
serviceList: [],
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
title: ''
},
selected: [],
defaultSelection: []
}
},
computed: {
displayNames() {
return this.selected.map(item => item.title).join(', ')
}
},
watch: {
value: {
handler(val) {
if (Array.isArray(val)) {
this.selected = this.serviceList.filter(item => val.includes(item.id))
} else if (typeof val === 'string' && val) {
const ids = val.split(',')
this.selected = this.serviceList.filter(item => ids.includes(String(item.id)))
} else {
this.selected = []
}
},
immediate: true
}
},
methods: {
openDialog() {
this.dialogVisible = true
this.getList()
},
getList() {
this.loading = true
listServiceGoods(this.queryParams).then(res => {
this.serviceList = res.rows
this.total = res.total
//
if (this.value) {
let ids = Array.isArray(this.value) ? this.value : (this.value ? this.value.split(',') : [])
this.defaultSelection = this.serviceList.filter(item => ids.includes(String(item.id)))
}
this.loading = false
})
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.queryParams.title = ''
this.handleQuery()
},
handleSelectionChange(val) {
// id
const map = new Map()
val.forEach(item => {
map.set(item.id, item)
})
this.selected = Array.from(map.values())
},
confirmSelection() {
const ids = this.selected.map(item => item.id)
this.$emit('input', ids)
this.dialogVisible = false
},
clearSelection() {
this.selected = []
this.$emit('input', [])
}
}
}
</script>

View File

@ -299,6 +299,33 @@
<editor v-model="form.material" :min-height="200" />
</el-form-item>
</el-tab-pane>
<el-tab-pane label="问答配置" name="qa">
<div class="qa-container">
<div class="qa-header">
<el-button type="primary" size="mini" icon="el-icon-plus" @click="addQuestion">添加问答</el-button>
</div>
<div v-for="(qa, index) in form.questionsArray" :key="index" class="qa-item">
<div class="qa-item-header">
<span class="qa-index">问答 #{{index + 1}}</span>
<el-button type="danger" size="mini" icon="el-icon-delete" @click="removeQuestion(index)">删除</el-button>
</div>
<el-row :gutter="10">
<el-col :span="24">
<el-form-item :label="'问题'" :prop="'questionsArray.' + index + '.question'" :rules="[{required: true, message: '问题不能为空', trigger: 'blur'}]" label-width="50px">
<el-input v-model="qa.question" placeholder="请输入问题" size="small" @input="handleQuestionChange"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item :label="'答案'" :prop="'questionsArray.' + index + '.answer'" :rules="[{required: true, message: '答案不能为空', trigger: 'blur'}]" label-width="50px">
<el-input type="textarea" v-model="qa.answer" :rows="2" placeholder="请输入答案" size="small" @input="handleQuestionChange"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
<div slot="footer" class="dialog-footer">
@ -412,6 +439,7 @@ export default {
skuList: [ { name: '', value: '' } ],
specList: [ { name: '', values: [''] } ],
skuTable: [],
saveTimeout: null, //
}
},
created() {
@ -454,10 +482,10 @@ export default {
skuValue: null,
latitude: null,
longitude: null,
type: 2, //
type: 2,
cateId: null,
project: null,
sort: 50, //
sort: 50,
material: null,
postage: null,
basic: null,
@ -465,7 +493,9 @@ export default {
skillIds: null,
createdAt: null,
updatedAt: null,
deletedAt: null
deletedAt: null,
questionsArray: [], //
questions: null, // JSON
}
// skuType
this.skuType = 1;
@ -524,6 +554,24 @@ export default {
const id = row.id || this.ids
getServiceGoods(id).then(response => {
this.form = response.data
//
if (this.form.questions) {
try {
const questionsArray = JSON.parse(this.form.questions);
if (Array.isArray(questionsArray)) {
this.$set(this.form, 'questionsArray', questionsArray);
} else {
this.$set(this.form, 'questionsArray', []);
}
} catch (e) {
console.error('问答数据解析失败:', e);
this.$set(this.form, 'questionsArray', []);
}
} else {
this.$set(this.form, 'questionsArray', []);
}
// skuType1
this.skuType = this.form.skuType || 1;
// sku
@ -544,44 +592,57 @@ export default {
},
/** 提交按钮 */
submitForm() {
//
this.form.skuType = this.skuType;
//
if (this.skuType === 2) {
//
if (this.$refs.skuRef && this.$refs.skuRef.submit) {
const skuData = this.$refs.skuRef.submit();
if (!skuData) {
this.$modal.msgError("请完善规格信息");
return;
}
this.form.sku = typeof skuData === 'string' ? skuData : JSON.stringify(skuData);
} else {
this.$modal.msgError("规格信息不能为空");
return;
}
} else {
//
if (!this.form.skuName || !this.form.skuValue) {
this.$modal.msgError("请完善单规格信息");
return;
}
const singleSku = {
name: this.form.skuName,
value: this.form.skuValue
};
this.form.sku = JSON.stringify(singleSku);
}
// sku
if (!this.form.sku || this.form.sku === '{}') {
this.$modal.msgError("规格信息不能为空");
return;
}
this.$refs["form"].validate(valid => {
if (valid) {
//
if (this.form.questionsArray && Array.isArray(this.form.questionsArray)) {
const validQuestions = this.form.questionsArray.filter(qa =>
qa && qa.question && qa.question.trim() && qa.answer && qa.answer.trim()
).map(qa => ({
question: qa.question.trim(),
answer: qa.answer.trim()
}));
this.form.questions = validQuestions.length > 0 ? JSON.stringify(validQuestions) : null;
} else {
this.form.questions = null;
}
//
this.form.skuType = this.skuType;
//
if (this.skuType === 2) {
//
if (this.$refs.skuRef && this.$refs.skuRef.submit) {
const skuData = this.$refs.skuRef.submit();
if (!skuData) {
this.$modal.msgError("请完善规格信息");
return;
}
this.form.sku = typeof skuData === 'string' ? skuData : JSON.stringify(skuData);
} else {
this.$modal.msgError("规格信息不能为空");
return;
}
} else {
//
if (!this.form.skuName || !this.form.skuValue) {
this.$modal.msgError("请完善单规格信息");
return;
}
const singleSku = {
name: this.form.skuName,
value: this.form.skuValue
};
this.form.sku = JSON.stringify(singleSku);
}
// sku
if (!this.form.sku || this.form.sku === '{}') {
this.$modal.msgError("规格信息不能为空");
return;
}
if (this.form.id != null) {
updateServiceGoods(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
@ -726,6 +787,125 @@ export default {
removeSkuImage(idx) {
this.$set(this.skuTable[idx], 'imageUrl', '');
},
//
addQuestion() {
if (!this.form.questionsArray) {
this.$set(this.form, 'questionsArray', []);
}
this.form.questionsArray.push({
question: '',
answer: ''
});
},
//
removeQuestion(index) {
this.form.questionsArray.splice(index, 1);
//
this.handleQuestionChange();
},
//
async silentSave() {
try {
//
if (!this.form.questionsArray || !Array.isArray(this.form.questionsArray)) {
return;
}
//
if (!this.form.id) {
return;
}
//
const validQuestions = this.form.questionsArray.filter(qa =>
qa && qa.question && qa.question.trim() && qa.answer && qa.answer.trim()
).map(qa => ({
question: qa.question.trim(),
answer: qa.answer.trim()
}));
//
const submitData = {
id: this.form.id,
questions: JSON.stringify(validQuestions)
};
//
await updateServiceGoods(submitData);
} catch (error) {
console.error('问答数据静默保存失败:', error);
}
},
//
handleQuestionChange() {
// 使
if (this.saveTimeout) {
clearTimeout(this.saveTimeout);
}
this.saveTimeout = setTimeout(() => {
this.silentSave();
}, 1000); // 1
},
}
}
</script>
<style scoped>
/* 问答样式 */
.qa-container {
padding: 5px;
}
.qa-header {
margin-bottom: 15px;
}
.qa-item {
margin-bottom: 10px;
padding: 10px;
border: 1px solid #EBEEF5;
border-radius: 4px;
background-color: #fafafa;
}
.qa-item:hover {
box-shadow: 0 2px 8px 0 rgba(0,0,0,.05);
}
.qa-item-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.qa-index {
font-size: 14px;
font-weight: bold;
color: #606266;
}
.qa-item :deep(.el-form-item) {
margin-bottom: 10px;
}
.qa-item :deep(.el-form-item__label) {
padding: 0 5px 0 0;
line-height: 32px;
}
.qa-item :deep(.el-form-item__content) {
line-height: 32px;
}
.qa-item :deep(.el-textarea__inner) {
padding: 5px 8px;
}
.qa-item :deep(.el-divider--horizontal) {
margin: 10px 0;
}
</style>

View File

@ -376,6 +376,18 @@
style="width: 200px"
/>
</el-form-item>
<el-form-item label="下单类型" prop="servicetype">
<el-radio-group v-model="form.servicetype">
<el-radio
v-for="dict in dict.type.servicetype"
:key="dict.value"
:label="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否可拼团" prop="isgroup">
<el-radio-group v-model="form.isgroup">
<el-radio
@ -489,6 +501,33 @@
<editor v-model="form.material" :min-height="200" />
</el-form-item>
</el-tab-pane>
<el-tab-pane label="问答配置" name="qa">
<div class="qa-container">
<div class="qa-header">
<el-button type="primary" size="mini" icon="el-icon-plus" @click="addQuestion">添加问答</el-button>
</div>
<div v-for="(qa, index) in form.questionsArray" :key="index" class="qa-item">
<div class="qa-item-header">
<span class="qa-index">问答 #{{index + 1}}</span>
<el-button type="danger" size="mini" icon="el-icon-delete" @click="removeQuestion(index)">删除</el-button>
</div>
<el-row :gutter="10">
<el-col :span="24">
<el-form-item :label="'问题'" :prop="'questionsArray.' + index + '.question'" :rules="[{required: true, message: '问题不能为空', trigger: 'blur'}]" label-width="50px">
<el-input v-model="qa.question" placeholder="请输入问题" size="small" @input="handleQuestionChange"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item :label="'答案'" :prop="'questionsArray.' + index + '.answer'" :rules="[{required: true, message: '答案不能为空', trigger: 'blur'}]" label-width="50px">
<el-input type="textarea" v-model="qa.answer" :rows="2" placeholder="请输入答案" size="small" @input="handleQuestionChange"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-form>
<div slot="footer" class="dialog-footer">
@ -524,7 +563,7 @@ import Editor from '@/components/Editor'
export default {
name: "ServiceGoods",
dicts: ['service_goods_status', 'fixed', 'service_commissiontype', 'service_dispatch'],
dicts: ['service_goods_status', 'fixed', 'service_commissiontype', 'service_dispatch','servicetype'],
components: { Editor },
data() {
return {
@ -570,7 +609,9 @@ export default {
project: null,
},
//
form: {},
form: {
questionsArray: [], //
},
//
rules: {
title: [
@ -613,6 +654,7 @@ export default {
//
showBasicInput: false,
newBasicTag: '',
saveTimeout: null, //
}
},
created() {
@ -686,17 +728,17 @@ export default {
skuValue: '',
latitude: null,
longitude: null,
type: 1, //
type: 1,
cateId: null,
project: null,
sort: 50, //
sort: 50,
material: null,
postage: null,
basic: null,
basicArray: [], //
basicArray: [],
margin: null,
skillIds: null,
skillIdsArray: [], //
skillIdsArray: [],
isgroup: 2,
groupprice: null,
isonce: null,
@ -705,12 +747,15 @@ export default {
commission: null,
dispatchtype: 1,
workerids: null,
servicetype: 1,
groupnum: 0,
isfixed: 2,
fixedprice: null,
createdAt: null,
updatedAt: null,
deletedAt: null
deletedAt: null,
questionsArray: [], //
questions: null, // JSON
}
// 使Vue.set
this.$set(this.form, 'skillIdsArray', []);
@ -787,6 +832,8 @@ export default {
this.newBasicTag = '';
// workerids
this.form.workerids = [];
//
this.$set(this.form, 'questionsArray', []);
console.log('新增时初始化form:', this.form);
//
@ -853,8 +900,24 @@ export default {
]).then(([serviceResponse, skillData]) => {
this.form = serviceResponse.data
console.log('编辑数据:', this.form);
console.log('技能列表数据:', skillData);
console.log('原始基检现象数据:', this.form.basic);
//
if (this.form.questions) {
try {
const questionsArray = JSON.parse(this.form.questions);
if (Array.isArray(questionsArray)) {
this.$set(this.form, 'questionsArray', questionsArray);
} else {
this.$set(this.form, 'questionsArray', []);
}
} catch (e) {
console.error('问答数据解析失败:', e);
this.$set(this.form, 'questionsArray', []);
}
} else {
this.$set(this.form, 'questionsArray', []);
}
// IDJSON
if (this.form.skillIds) {
try {
@ -1024,6 +1087,19 @@ export default {
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
//
if (this.form.questionsArray && Array.isArray(this.form.questionsArray)) {
const validQuestions = this.form.questionsArray.filter(qa =>
qa && qa.question && qa.question.trim() && qa.answer && qa.answer.trim()
).map(qa => ({
question: qa.question.trim(),
answer: qa.answer.trim()
}));
this.form.questions = validQuestions.length > 0 ? JSON.stringify(validQuestions) : null;
} else {
this.form.questions = null;
}
//
this.form.skuType = this.skuType;
@ -1448,6 +1524,79 @@ export default {
return '-'
}
},
//
addQuestion() {
//
this.silentSave().then(() => {
if (!this.form.questionsArray) {
this.$set(this.form, 'questionsArray', []);
}
this.form.questionsArray.push({
question: '',
answer: ''
});
});
},
//
removeQuestion(index) {
this.form.questionsArray.splice(index, 1);
//
this.silentSave();
},
//
async silentSave() {
try {
//
if (!this.form.questionsArray || !Array.isArray(this.form.questionsArray)) {
return;
}
//
const validQuestions = this.form.questionsArray.filter(qa =>
qa && qa.question && qa.question.trim() && qa.answer && qa.answer.trim()
).map(qa => ({
question: qa.question.trim(),
answer: qa.answer.trim()
}));
//
if (validQuestions.length === 0) {
return;
}
//
if (!this.form.id) {
return;
}
//
const submitData = {
id: this.form.id,
questions: JSON.stringify(validQuestions)
};
//
await updateServiceGoods(submitData);
console.log('问答数据静默保存成功');
} catch (error) {
console.error('问答数据静默保存失败:', error);
//
}
},
//
handleQuestionChange() {
// 使
if (this.saveTimeout) {
clearTimeout(this.saveTimeout);
}
this.saveTimeout = setTimeout(() => {
this.silentSave();
}, 1000); // 1
},
}
}
</script>
@ -1473,4 +1622,59 @@ export default {
.basic-tags-container .el-tag:hover {
transform: scale(1.05);
}
/* 问答样式 */
.qa-container {
padding: 5px;
}
.qa-header {
margin-bottom: 15px;
}
.qa-item {
margin-bottom: 10px;
padding: 10px;
border: 1px solid #EBEEF5;
border-radius: 4px;
background-color: #fafafa;
}
.qa-item:hover {
box-shadow: 0 2px 8px 0 rgba(0,0,0,.05);
}
.qa-item-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.qa-index {
font-size: 14px;
font-weight: bold;
color: #606266;
}
.qa-item :deep(.el-form-item) {
margin-bottom: 10px;
}
.qa-item :deep(.el-form-item__label) {
padding: 0 5px 0 0;
line-height: 32px;
}
.qa-item :deep(.el-form-item__content) {
line-height: 32px;
}
.qa-item :deep(.el-textarea__inner) {
padding: 5px 8px;
}
.qa-item :deep(.el-divider--horizontal) {
margin: 10px 0;
}
</style>

View File

@ -177,6 +177,75 @@
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="评价标签" name="config_six">
<el-form :model="ratingForm" label-width="120px" class="tab-form">
<el-form-item label="服务评价标签">
<el-select v-model="ratingForm.service" multiple filterable allow-create default-first-option placeholder="请输入服务评价标签" style="width: 600px">
<el-option v-for="item in ratingForm.service" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item label="商品评价标签">
<el-select v-model="ratingForm.goods" multiple filterable allow-create default-first-option placeholder="请输入商品评价标签" style="width: 600px">
<el-option v-for="item in ratingForm.goods" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="saveAllConfig('6')">提交</el-button>
<el-button @click="resetRating">重置</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="首页轮播图" name="config_banner">
<el-form label-width="120px" class="tab-form">
<div class="banner-list">
<div v-for="(item, index) in bannerForm.banner" :key="index" class="banner-item">
<el-card>
<div class="banner-content">
<div class="banner-image">
<el-upload
class="banner-uploader"
:action="uploadImgUrl"
:headers="headers"
:show-file-list="false"
:on-success="(response, file) => handleBannerSuccess(response, file, index)"
:on-error="handleBannerError"
:before-upload="beforeBannerUpload"
>
<div v-if="item.imageUrl" class="banner-img-container">
<img :src="item.imageUrl" class="banner-img">
<div class="banner-img-mask">
<div class="banner-img-actions">
<el-button type="primary" size="small" icon="el-icon-refresh">更换图片</el-button>
</div>
</div>
</div>
<i v-else class="el-icon-plus banner-uploader-icon"></i>
</el-upload>
</div>
<div class="banner-form">
<div class="banner-form-fields">
<el-form-item label="跳转链接" class="banner-link-item">
<el-input v-model="item.link" placeholder="请输入跳转链接"></el-input>
</el-form-item>
<div class="banner-form-right">
<el-form-item label="排序" class="banner-sort-item">
<el-input-number v-model="item.sort" :min="0" :max="99"></el-input-number>
</el-form-item>
<el-button type="danger" icon="el-icon-delete" circle @click="removeBanner(index)"></el-button>
</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
<div class="banner-actions">
<el-button type="primary" icon="el-icon-plus" @click="addBanner">添加轮播图</el-button>
<el-button type="primary" @click="saveAllConfig('banner')">保存</el-button>
<el-button @click="resetBanner">重置</el-button>
</div>
</el-form>
</el-tab-pane>
</el-tabs>
<el-button type="primary" style="margin-top: 24px;" @click="saveAllConfig">保存全部配置</el-button>
</div>
@ -184,6 +253,7 @@
<script>
import { listSiteConfig, getSiteConfig, delSiteConfig, addSiteConfig, updateSiteConfig } from "@/api/system/SiteConfig"
import { getToken } from "@/utils/auth"
import { quillEditor } from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
@ -196,7 +266,7 @@ export default {
},
data() {
return {
//
//
loading: true,
activeTab: 'base',
SiteConfigList: [],
@ -205,6 +275,7 @@ export default {
config_three: {},
config_four: {},
config_five: {},
config_six: {},
total: 0, //
//
baseForm: {
@ -232,6 +303,11 @@ export default {
memberForm:{
member: ''
},
//
ratingForm: {
service: ['服务态度好', '技术专业', '准时守信', '认真负责', '价格合理'],
goods: ['商品质量好', '包装完整', '物流快速', '性价比高', '描述相符']
},
//
orderTimes: [
@ -244,6 +320,16 @@ export default {
},
editorOptions: {
placeholder: '请输入质保金说明...'
},
config_seven: {},
bannerForm: {
banner: []
},
//
uploadImgUrl: process.env.VUE_APP_BASE_API + "/api/public/upload/file",
//
headers: {
Authorization: 'Bearer ' + getToken()
}
}
},
@ -297,6 +383,16 @@ export default {
this.memberForm = { member: configfiveObj.member || '' }
}
// config_six
this.config_six = response.rows.find(item => item.name === 'config_six')
if (this.config_six && this.config_six.value) {
const configSixObj = JSON.parse(this.config_six.value)
this.ratingForm = {
service: configSixObj.service || ['服务态度好', '技术专业', '准时守信', '认真负责', '价格合理'],
goods: configSixObj.goods || ['商品质量好', '包装完整', '物流快速', '性价比高', '描述相符']
}
}
// config_three
this.config_three = response.rows.find(item => item.name === 'config_three')
this.orderTimes = []
@ -325,6 +421,13 @@ export default {
}
}
// config_seven
this.config_seven = response.rows.find(item => item.name === 'config_seven')
if (this.config_seven && this.config_seven.value) {
const configBannerObj = JSON.parse(this.config_seven.value)
this.bannerForm.banner = configBannerObj.banner || []
}
this.total = response.total
this.loading = false
})
@ -396,6 +499,12 @@ export default {
resetMember() {
this.memberForm = { member: '' }
},
resetRating() {
this.ratingForm = {
service: ['服务态度好', '技术专业', '准时守信', '认真负责', '价格合理'],
goods: ['商品质量好', '包装完整', '物流快速', '性价比高', '描述相符']
}
},
async saveAllConfig(e) {
// 1. config_one
const config_one = {
@ -437,23 +546,90 @@ export default {
const config_five = {
member: this.memberForm.member
};
// 6. config_six
const config_six = {
service: this.ratingForm.service,
goods: this.ratingForm.goods
};
// config_seven
const config_seven = {
banner: this.bannerForm.banner.map(item => ({
imageUrl: item.imageUrl,
link: item.link,
sort: item.sort
})).sort((a, b) => a.sort - b.sort)
};
try {
if(e=='1'){
await updateSiteConfig({ name: 'config_one',id:this.config_one.id, value: JSON.stringify(config_one) });
}else if(e=='2'){
await updateSiteConfig({ name: 'config_two',id:this.config_two.id, value: JSON.stringify(config_two) });
}else if(e=='3'){
await updateSiteConfig({ name: 'config_three',id:this.config_three.id, value: JSON.stringify(config_three) });
}else if(e=='4'){
if(e=='1'){
await updateSiteConfig({ name: 'config_one',id:this.config_one.id, value: JSON.stringify(config_one) });
}else if(e=='2'){
await updateSiteConfig({ name: 'config_two',id:this.config_two.id, value: JSON.stringify(config_two) });
}else if(e=='3'){
await updateSiteConfig({ name: 'config_three',id:this.config_three.id, value: JSON.stringify(config_three) });
}else if(e=='4'){
await updateSiteConfig({ name: 'config_four',id:this.config_four.id, value: JSON.stringify(config_four) });
}else if(e=='5'){
await updateSiteConfig({ name: 'config_five',id:this.config_five.id, value: JSON.stringify(config_five) });
}
}else if(e=='5'){
await updateSiteConfig({ name: 'config_five',id:this.config_five.id, value: JSON.stringify(config_five) });
}else if(e=='6'){
if (!this.config_six || !this.config_six.id) {
await addSiteConfig({ name: 'config_six', value: JSON.stringify(config_six), status: 1 });
} else {
await updateSiteConfig({ name: 'config_six', id: this.config_six.id, value: JSON.stringify(config_six) });
}
}else if(e=='banner'){
if (!this.config_seven || !this.config_seven.id) {
await addSiteConfig({ name: 'config_seven', value: JSON.stringify(config_seven), status: 1 });
} else {
await updateSiteConfig({ name: 'config_seven', id: this.config_seven.id, value: JSON.stringify(config_seven) });
}
}
this.$message.success('保存成功!');
this.getList();
} catch (e) {
console.error('保存失败:', e);
this.$message.error('保存失败,请重试');
}
},
handleBannerSuccess(response, file, index) {
if (response.code === 200) {
this.bannerForm.banner[index].imageUrl = response.data.full_path
this.$message.success('图片上传成功')
} else {
this.$message.error(response.msg)
}
},
handleBannerError(err) {
this.$message.error('图片上传失败')
console.error('上传失败:', err)
},
beforeBannerUpload(file) {
const isImg = file.type.startsWith('image/')
const isLt5M = file.size / 1024 / 1024 < 5
if (!isImg) {
this.$message.error('只能上传图片格式!')
}
if (!isLt5M) {
this.$message.error('上传图片大小不能超过 5MB!')
}
return isImg && isLt5M
},
addBanner() {
this.bannerForm.banner.push({
imageUrl: '',
link: '',
sort: this.bannerForm.banner.length
})
},
removeBanner(index) {
this.bannerForm.banner.splice(index, 1)
//
this.bannerForm.banner.forEach((item, idx) => {
item.sort = idx
})
},
resetBanner() {
this.bannerForm.banner = []
}
}
}
@ -490,4 +666,102 @@ if(e=='1'){
font-size: 32px;
color: #8c939d;
}
/* 轮播图样式 */
.banner-list {
margin-bottom: 20px;
}
.banner-item {
margin-bottom: 20px;
}
.banner-content {
display: flex;
align-items: flex-start;
gap: 20px;
width: 100%;
}
.banner-image {
flex-shrink: 0;
}
.banner-form {
flex-grow: 1;
width: calc(100% - 380px); /* 360px for image + 20px gap */
}
.banner-form-fields {
display: flex;
flex-direction: column;
gap: 15px;
width: 100%;
}
.banner-link-item {
margin-bottom: 0;
width: 100%;
}
.banner-form-right {
display: flex;
align-items: center;
gap: 15px;
}
.banner-sort-item {
margin-bottom: 0;
}
.banner-form .el-form-item__content {
width: calc(100% - 120px); /* 120px is label width */
}
.banner-uploader {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
width: 360px;
height: 200px;
}
.banner-uploader:hover {
border-color: #409EFF;
}
.banner-img-container {
position: relative;
width: 360px;
height: 200px;
}
.banner-img {
width: 360px;
height: 200px;
display: block;
object-fit: cover;
}
.banner-img-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.3s;
}
.banner-img-container:hover .banner-img-mask {
opacity: 1;
}
.banner-img-actions {
text-align: center;
}
.banner-img-actions .el-button {
margin: 0 5px;
}
.banner-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 360px;
height: 200px;
line-height: 200px;
text-align: center;
}
.banner-actions {
margin-top: 20px;
}
</style>

View File

@ -0,0 +1,162 @@
<template>
<el-dialog
:title="title"
:visible.sync="visible"
width="800px"
append-to-body
:close-on-click-modal="false"
destroy-on-close
>
<div>
<el-input
v-model="searchKeyword"
placeholder="请输入服务名称搜索"
clearable
prefix-icon="el-icon-search"
style="width: 300px; margin-bottom: 10px;"
@keyup.enter.native="handleSearch"
@clear="handleSearch"
>
<el-button slot="append" icon="el-icon-search" @click="handleSearch">搜索</el-button>
</el-input>
<el-table
ref="serviceTable"
:data="serviceList"
@select="handleSelectionChange"
@select-all="handleSelectionChange"
height="400"
border
v-loading="loading"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="服务ID" prop="id" width="80" align="center" />
<el-table-column label="服务名称" prop="title" align="center" />
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNum"
:page-sizes="[10, 20, 30, 50]"
:page-size.sync="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
style="margin-top: 10px;"
/>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button type="primary" @click="confirmSelection"> </el-button>
</div>
</el-dialog>
</template>
<script>
import { listServiceGoods } from '@/api/system/ServiceGoods'
export default {
name: 'ServiceGoodsSelectDialog',
props: {
value: {
type: [Array, String],
default: () => []
},
visible: {
type: Boolean,
default: false
},
title: {
type: String,
default: '选择服务项目'
}
},
data() {
return {
searchKeyword: '',
serviceList: [],
loading: false,
pageNum: 1,
pageSize: 10,
total: 0,
tempSelected: []
}
},
watch: {
visible(val) {
if (val) {
this.tempSelected = Array.isArray(this.value) ? [...this.value] : (this.value ? JSON.parse(this.value) : [])
this.getList()
}
}
},
methods: {
getList() {
this.loading = true
listServiceGoods({ pageNum: this.pageNum, pageSize: this.pageSize, title: this.searchKeyword }).then(res => {
this.serviceList = res.rows || []
this.total = res.total || 0
this.$nextTick(() => {
if (this.$refs.serviceTable) {
this.$refs.serviceTable.clearSelection()
const selectedIds = (this.tempSelected || []).map(String)
this.serviceList.forEach(row => {
if (selectedIds.includes(String(row.id))) {
this.$refs.serviceTable.toggleRowSelection(row, true)
}
})
}
})
this.loading = false
}).catch(() => {
this.loading = false
})
},
handleSearch() {
this.pageNum = 1
this.getList()
},
handleSizeChange(val) {
this.pageSize = val
this.getList()
},
handleCurrentChange(val) {
this.pageNum = val
this.getList()
},
handleSelectionChange(selection) {
this.tempSelected = selection.map(item => String(item.id))
},
confirmSelection() {
this.$emit('input', JSON.stringify(this.tempSelected))
this.$emit('update:visible', false)
},
closeDialog() {
this.$emit('update:visible', false)
}
}
}
</script>
<style scoped>
.service-tag-content {
display: inline-flex;
align-items: center;
gap: 6px;
max-width: 200px;
overflow: hidden;
padding: 0 4px;
}
.service-title {
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100px;
}
.service-id {
color: #909399;
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 90px;
}
</style>

View File

@ -0,0 +1,454 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入标题"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option
v-for="dict in dict.type.cika"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:UserSecondaryCard:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:UserSecondaryCard:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:UserSecondaryCard:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:UserSecondaryCard:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="UserSecondaryCardList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="订单id" align="center" prop="orderid" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="服务项目" align="center" prop="goodsname" />
<el-table-column label="展示价格" align="center" prop="showMoney" />
<el-table-column label="真实付款价格" align="center" prop="realMoney" />
<el-table-column label="展示图片" align="center" prop="showimage" width="100">
<template slot-scope="scope">
<image-preview :src="scope.row.showimage" :width="50" :height="50"/>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.cika" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="creattime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.creattime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="分类" align="center" prop="type" />
<el-table-column label="可提供服务数" align="center" prop="num" />
<el-table-column label="总服务数" align="center" prop="allnum" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:UserSecondaryCard:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:UserSecondaryCard:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改次卡管理对话框 -->
<el-dialog :title="title" :visible.sync="open" width="45" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="服务项目" prop="goodsids">
<el-select
v-model="form.goodsids"
multiple
filterable
clearable
placeholder="请选择服务项目"
style="width: 100%"
@change="onGoodsidsChange"
>
<el-option
v-for="item in ServiceGoodsList"
:key="item.id"
:label="item.title"
:value="String(item.id)"
/>
</el-select>
</el-form-item>
<el-form-item label="分类" prop="type">
<el-select v-model="form.type" placeholder="请选择分类">
<el-option v-for="cate in serviceCateList" :key="cate.id" :label="cate.title" :value="cate.id" />
</el-select>
</el-form-item>
<el-form-item label="展示价格" prop="showMoney">
<el-input-number
v-model="form.showMoney"
:precision="2"
:min="0"
:step="0.01"
placeholder="请输入展示价格"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="真实付款价格" prop="realMoney">
<el-input-number
v-model="form.realMoney"
:precision="2"
:min="0"
:step="0.01"
placeholder="请输入真实付款价格"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="展示图片" prop="showimage">
<image-upload v-model="form.showimage"/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.cika"
:key="dict.value"
:label="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="可提供服务数" prop="num">
<el-input-number
v-model="form.num"
:min="1"
:step="1"
:precision="0"
placeholder="请输入可提供服务数"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="总服务数" prop="allnum">
<el-input-number
v-model="form.allnum"
:min="1"
:step="1"
:precision="0"
placeholder="请输入总服务数"
style="width: 100%"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listUserSecondaryCard, getUserSecondaryCard, delUserSecondaryCard, addUserSecondaryCard, updateUserSecondaryCard ,selectList,selectServiceCateList} from "@/api/system/UserSecondaryCard"
export default {
name: "UserSecondaryCard",
dicts: ['cika'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
serviceCateList: [],
ServiceGoodsList: [],
//
UserSecondaryCardList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderid: null,
title: null,
goodsids: null,
showMoney: null,
realMoney: null,
showimage: null,
status: null,
creattime: null,
createdAt: null,
updatedAt: null,
type: null,
num: null,
allnum: null
},
//
form: {},
//
rules: {
showMoney: [
{ required: true, message: '请输入展示价格', trigger: 'blur' },
{ pattern: /^(0|[1-9]\d*)(\.\d{1,2})?$/, message: '请输入正确的金额(最多两位小数)', trigger: 'blur' }
],
realMoney: [
{ required: true, message: '请输入真实付款价格', trigger: 'blur' },
{ pattern: /^(0|[1-9]\d*)(\.\d{1,2})?$/, message: '请输入正确的金额(最多两位小数)', trigger: 'blur' }
],
num: [
{ required: true, message: '请输入可提供服务数', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' }
],
allnum: [
{ required: true, message: '请输入总服务数', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' }
]
}
}
},
created() {
this.getList()
this.getserviceCateList();
},
methods: {
/** 查询次卡管理列表 */
getList() {
this.loading = true
listUserSecondaryCard(this.queryParams).then(response => {
this.UserSecondaryCardList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
orderid: null,
title: null,
goodsids: null,
showMoney: null,
realMoney: null,
showimage: null,
status: null,
creattime: null,
createdAt: null,
updatedAt: null,
type: null,
num: null,
allnum: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
getUserSecondaryCard () {
selectList().then(response => {
this.ServiceGoodsList = response.data
})
},
/** 新增按钮操作 */
handleAdd() {
this.getUserSecondaryCard();
this.reset()
this.open = true
this.title = "添加次卡管理"
},
getserviceCateList(){
selectServiceCateList().then(response => {
this.serviceCateList = response.data
})
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
this.getUserSecondaryCard();
const id = row.id || this.ids
getUserSecondaryCard(id).then(response => {
this.form = response.data
// goodsidsJSON
if (this.form.goodsids) {
if (typeof this.form.goodsids === 'string') {
try {
const arr = JSON.parse(this.form.goodsids)
if (Array.isArray(arr)) {
this.form.goodsids = arr.map(i => String(i))
} else {
this.form.goodsids = this.form.goodsids.split(',').map(i => String(i).trim()).filter(i => i)
}
} catch (e) {
this.form.goodsids = this.form.goodsids.split(',').map(i => String(i).trim()).filter(i => i)
}
} else if (Array.isArray(this.form.goodsids)) {
this.form.goodsids = this.form.goodsids.map(i => String(i))
}
} else {
this.form.goodsids = []
}
this.onGoodsidsChange(this.form.goodsids);
this.open = true
this.title = "修改次卡管理"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
// goodsidsJSON
const submitForm = { ...this.form, goodsids: Array.isArray(this.form.goodsids) ? JSON.stringify(this.form.goodsids.map(String)) : this.form.goodsids }
if (this.form.id != null) {
updateUserSecondaryCard(submitForm).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addUserSecondaryCard(submitForm).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除次卡管理编号为"' + ids + '"的数据项?').then(function() {
return delUserSecondaryCard(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/UserSecondaryCard/export', {
...this.queryParams
}, `UserSecondaryCard_${new Date().getTime()}.xlsx`)
},
//
onGoodsidsChange(val) {
this.form.allnum = Array.isArray(val) ? val.length : 0
}
}
}
</script>

View File

@ -0,0 +1,348 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="次卡id" prop="carid">
<el-input
v-model="queryParams.carid"
placeholder="请输入次卡id"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
<el-option
v-for="dict in dict.type.user_cika"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:UserUseSecondaryCard:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:UserUseSecondaryCard:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:UserUseSecondaryCard:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:UserUseSecondaryCard:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="UserUseSecondaryCardList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="用户id" align="center" prop="uid" />
<el-table-column label="次卡id" align="center" prop="carid" />
<el-table-column label="服务id" align="center" prop="goodsids" />
<el-table-column label="用户可用数量" align="center" prop="num" />
<el-table-column label="用户已用数量" align="center" prop="usenum" />
<el-table-column label="订单id" align="center" prop="orderid" />
<el-table-column label="支付id" align="center" prop="transactionId" />
<el-table-column label="支付金额" align="center" prop="paymoney" />
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.user_cika" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createdAt" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:UserUseSecondaryCard:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:UserUseSecondaryCard:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改次卡使用对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户id" prop="uid">
<el-input v-model="form.uid" placeholder="请输入用户id" />
</el-form-item>
<el-form-item label="次卡id" prop="carid">
<el-input v-model="form.carid" placeholder="请输入次卡id" />
</el-form-item>
<el-form-item label="服务id" prop="goodsids">
<el-input v-model="form.goodsids" placeholder="请输入服务id" />
</el-form-item>
<el-form-item label="用户可用数量" prop="num">
<el-input v-model="form.num" placeholder="请输入用户可用数量" />
</el-form-item>
<el-form-item label="用户已用数量" prop="usenum">
<el-input v-model="form.usenum" placeholder="请输入用户已用数量" />
</el-form-item>
<el-form-item label="订单id" prop="orderid">
<el-input v-model="form.orderid" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="支付id" prop="transactionId">
<el-input v-model="form.transactionId" placeholder="请输入支付id" />
</el-form-item>
<el-form-item label="支付金额" prop="paymoney">
<el-input v-model="form.paymoney" placeholder="请输入支付金额" />
</el-form-item>
<el-form-item label="状态 1可用 2已用完 3已退款" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in dict.type.user_cika"
:key="dict.value"
:label="parseInt(dict.value)"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="${comment}" prop="createdAt">
<el-date-picker clearable
v-model="form.createdAt"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择${comment}">
</el-date-picker>
</el-form-item>
<el-form-item label="${comment}" prop="updatedAt">
<el-date-picker clearable
v-model="form.updatedAt"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择${comment}">
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listUserUseSecondaryCard, getUserUseSecondaryCard, delUserUseSecondaryCard, addUserUseSecondaryCard, updateUserUseSecondaryCard } from "@/api/system/UserUseSecondaryCard"
export default {
name: "UserUseSecondaryCard",
dicts: ['user_cika'],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
// 使
UserUseSecondaryCardList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
uid: null,
carid: null,
goodsids: null,
num: null,
usenum: null,
orderid: null,
transactionId: null,
paymoney: null,
status: null,
createdAt: null,
updatedAt: null
},
//
form: {},
//
rules: {
}
}
},
created() {
this.getList()
},
methods: {
/** 查询次卡使用列表 */
getList() {
this.loading = true
listUserUseSecondaryCard(this.queryParams).then(response => {
this.UserUseSecondaryCardList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
uid: null,
carid: null,
goodsids: null,
num: null,
usenum: null,
orderid: null,
transactionId: null,
paymoney: null,
status: null,
createdAt: null,
updatedAt: null
}
this.resetForm("form")
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset()
this.open = true
this.title = "添加次卡使用"
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset()
const id = row.id || this.ids
getUserUseSecondaryCard(id).then(response => {
this.form = response.data
this.open = true
this.title = "修改次卡使用"
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateUserUseSecondaryCard(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false
this.getList()
})
} else {
addUserUseSecondaryCard(this.form).then(response => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除次卡使用编号为"' + ids + '"的数据项?').then(function() {
return delUserUseSecondaryCard(ids)
}).then(() => {
this.getList()
this.$modal.msgSuccess("删除成功")
}).catch(() => {})
},
/** 导出按钮操作 */
handleExport() {
this.download('system/UserUseSecondaryCard/export', {
...this.queryParams
}, `UserUseSecondaryCard_${new Date().getTime()}.xlsx`)
}
}
}
</script>