This commit is contained in:
zt
2025-02-25 14:44:36 +08:00
parent ad3fc57a67
commit b0b44e2813
14 changed files with 462 additions and 32 deletions

View File

@ -179,5 +179,6 @@ public interface ErrorCodeConstants {
ErrorCode WX_STORE_ORDER_NOT_EXISTS = new ErrorCode(1_004_032_00, "微信付款码订单不存在");
ErrorCode WX_STORE_ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_004_032_01, "微信付款码订单详情不存在");
ErrorCode ORDER_DETAIL_LOG_NOT_EXISTS = new ErrorCode(1_004_033_01, "打菜日志不存在");
}

View File

@ -0,0 +1,95 @@
package cn.iocoder.yudao.module.member.controller.admin.orderdetaillog;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetaillog.OrderDetailLogDO;
import cn.iocoder.yudao.module.member.service.orderdetaillog.OrderDetailLogService;
@Tag(name = "管理后台 - 打菜日志")
@RestController
@RequestMapping("/member/order-detail-log")
@Validated
public class OrderDetailLogController {
@Resource
private OrderDetailLogService orderDetailLogService;
@PostMapping("/create")
@Operation(summary = "创建打菜日志")
@PreAuthorize("@ss.hasPermission('member:order-detail-log:create')")
public CommonResult<Long> createOrderDetailLog(@Valid @RequestBody OrderDetailLogSaveReqVO createReqVO) {
return success(orderDetailLogService.createOrderDetailLog(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新打菜日志")
@PreAuthorize("@ss.hasPermission('member:order-detail-log:update')")
public CommonResult<Boolean> updateOrderDetailLog(@Valid @RequestBody OrderDetailLogSaveReqVO updateReqVO) {
orderDetailLogService.updateOrderDetailLog(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除打菜日志")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('member:order-detail-log:delete')")
public CommonResult<Boolean> deleteOrderDetailLog(@RequestParam("id") Long id) {
orderDetailLogService.deleteOrderDetailLog(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得打菜日志")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('member:order-detail-log:query')")
public CommonResult<OrderDetailLogRespVO> getOrderDetailLog(@RequestParam("id") Long id) {
OrderDetailLogDO orderDetailLog = orderDetailLogService.getOrderDetailLog(id);
return success(BeanUtils.toBean(orderDetailLog, OrderDetailLogRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得打菜日志分页")
@PreAuthorize("@ss.hasPermission('member:order-detail-log:query')")
public CommonResult<PageResult<OrderDetailLogRespVO>> getOrderDetailLogPage(@Valid OrderDetailLogPageReqVO pageReqVO) {
PageResult<OrderDetailLogDO> pageResult = orderDetailLogService.getOrderDetailLogPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, OrderDetailLogRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出打菜日志 Excel")
@PreAuthorize("@ss.hasPermission('member:order-detail-log:export')")
@OperateLog(type = EXPORT)
public void exportOrderDetailLogExcel(@Valid OrderDetailLogPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<OrderDetailLogDO> list = orderDetailLogService.getOrderDetailLogPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "打菜日志.xls", "数据", OrderDetailLogRespVO.class,
BeanUtils.toBean(list, OrderDetailLogRespVO.class));
}
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 打菜日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OrderDetailLogPageReqVO extends PageParam {
@Schema(description = "设备安卓码")
private String deviceSn;
@Schema(description = "门店id", example = "32573")
private Long storeId;
@Schema(description = "请求参数")
private String param;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "存入参数")
private String insertParam;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 打菜日志 Response VO")
@Data
@ExcelIgnoreUnannotated
public class OrderDetailLogRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25176")
@ExcelProperty("主键")
private Long id;
@Schema(description = "设备安卓码")
@ExcelProperty("设备安卓码")
private String deviceSn;
@Schema(description = "门店id", example = "32573")
@ExcelProperty("门店id")
private Long storeId;
@Schema(description = "请求参数")
@ExcelProperty("请求参数")
private String param;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "存入参数")
@ExcelProperty("存入参数")
private String insertParam;
}

View File

@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 打菜日志新增/修改 Request VO")
@Data
public class OrderDetailLogSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25176")
private Long id;
@Schema(description = "设备安卓码")
private String deviceSn;
@Schema(description = "门店id", example = "32573")
private Long storeId;
@Schema(description = "请求参数")
private String param;
@Schema(description = "存入参数")
private String insertParam;
}

View File

@ -57,15 +57,12 @@ public class AppDiningPlatesController {
public CommonResult<AppUserInfoCardVO> bindByFace(@RequestBody BindVO vo) {
return success(diningPlatesService.bindByFace(vo.getDiningPlatesNum(), vo.getFaceId(), vo.getStoreId(), vo.getMobile(),vo.getFaceData()));
}
// @GetMapping("/bindByFace")
// @Operation(summary = "人脸绑定餐盘")
// public CommonResult<AppUserInfoCardVO> bindByFace(String diningPlatesNum, Long faceId,Long storeId,String mobile) {
// return success(diningPlatesService.bindByFace(diningPlatesNum,faceId,storeId,mobile));
// }
@GetMapping("/bindByFace")
@Operation(summary = "人脸绑定餐盘")
public CommonResult<AppUserInfoCardVO> bindByFace(String diningPlatesNum, Long faceId,Long storeId,String mobile) {
return success(diningPlatesService.bindByFace(diningPlatesNum,faceId,storeId,mobile,null));
}
@GetMapping("/checkBind")
@Operation(summary = "验证餐盘绑定")

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.member.dal.dataobject.orderdetaillog;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 打菜日志 DO
*
* @author 我是秦俊旗
*/
@TableName("member_order_detail_log")
@KeySequence("member_order_detail_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderDetailLogDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 设备安卓码
*/
private String deviceSn;
/**
* 门店id
*/
private Long storeId;
/**
* 请求参数
*/
private String param;
/**
* 存入参数
*/
private String insertParam;
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.member.dal.mysql.orderdetaillog;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetaillog.OrderDetailLogDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.*;
/**
* 打菜日志 Mapper
*
* @author 我是秦俊旗
*/
@Mapper
public interface OrderDetailLogMapper extends BaseMapperX<OrderDetailLogDO> {
default PageResult<OrderDetailLogDO> selectPage(OrderDetailLogPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<OrderDetailLogDO>()
.eqIfPresent(OrderDetailLogDO::getDeviceSn, reqVO.getDeviceSn())
.eqIfPresent(OrderDetailLogDO::getStoreId, reqVO.getStoreId())
.eqIfPresent(OrderDetailLogDO::getParam, reqVO.getParam())
.betweenIfPresent(OrderDetailLogDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(OrderDetailLogDO::getInsertParam, reqVO.getInsertParam())
.orderByDesc(OrderDetailLogDO::getId));
}
}

View File

@ -20,4 +20,6 @@ public interface MemberAsyncService {
void batchRecord(AddReqVO addReqVO);
void saveFace(String faceData,String path);
// void saveOrderDetailLog(AppOrderDetailSaveReqVO vo);
}

View File

@ -14,12 +14,15 @@ import cn.iocoder.yudao.module.member.dal.dataobject.storegoodsinventoryrecord.S
import cn.iocoder.yudao.module.member.dal.mysql.diningplates.DiningPlatesMapper;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
import cn.iocoder.yudao.module.member.dal.mysql.storegoodsinventoryrecord.StoreGoodsInventoryRecordMapper;
import cn.iocoder.yudao.module.member.service.orderdetaillog.OrderDetailLogService;
import cn.iocoder.yudao.module.member.service.storegoods.StoreGoodsService;
import cn.iocoder.yudao.module.system.api.dishesnutrition.DishesNutritionApi;
import cn.iocoder.yudao.module.system.api.dishesnutrition.dto.DishesNutritionRespDTO;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.File;
@ -54,6 +57,9 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
@Resource
private StoreGoodsService storeGoodsService;
@Resource
private OrderDetailLogService detailLogService;
@Resource
private StoreGoodsInventoryRecordMapper storeGoodsInventoryRecordMapper;
@ -68,6 +74,7 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
@Async
@Override
@Transactional(rollbackFor = Exception.class)
public void createOrderDetail(AppOrderDetailSaveReqVO createReqVO, OtherVO otherVO) {
DishesNutritionRespDTO dishEnergy = dishesNutritionApi.getDishEnergy(createReqVO.getDishesId());
@ -112,31 +119,39 @@ public class MemberAsyncServiceImpl implements MemberAsyncService{
@Async
@Override
public void saveFace(String faceData, String path) {
try {
// 解码 Base64 字符串
// 过滤非法字符
String s = faceData.replaceAll("\n", "");
byte[] decodedBytes = Base64.getDecoder().decode(s);
if (StringUtil.isNotBlank(faceData)){
try {
// 解码 Base64 字符
// 过滤非法字符
String s = faceData.replaceAll("\n", "");
byte[] decodedBytes = Base64.getDecoder().decode(s);
// 指定保存文件的路径// 根据实际情况修改文件路径和文件名
String uploadDirPath= "orderFaceData/";
// 指定保存文件的路径// 根据实际情况修改文件路径和文件名
String uploadDirPath= "orderFaceData/";
// 创建上传文件目录
File uploadDir = new File(uploadDirPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
// 创建上传文件目录
File uploadDir = new File(uploadDirPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
// 创建文件输出流
try (FileOutputStream fos = new FileOutputStream(path)) {
// 将解码后的数据写入文件
fos.write(decodedBytes);
System.out.println("文件保存成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
// 创建文件输出流
try (FileOutputStream fos = new FileOutputStream(path)) {
// 将解码后的数据写入文件
fos.write(decodedBytes);
System.out.println("文件保存成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
// @Async
// @Override
// public void saveOrderDetailLog(AppOrderDetailSaveReqVO vo) {
// detailLogService.insertOne(logDO);
// }
public void discard(){
//DishesNutritionRespDTO dishEnergy = dishesNutritionApi.getDishEnergy(createReqVO.getDishesId());
//

View File

@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.member.service.orderdetail;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.OrderDetailLogSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.screen.vo.DishVO;
import cn.iocoder.yudao.module.member.controller.app.orderdetail.vo.AppOrderDetailPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.orderdetail.vo.AppOrderDetailRespVO;
@ -16,6 +18,7 @@ import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetail.OrderDetailMapper;
import cn.iocoder.yudao.module.member.service.async.MemberAsyncService;
import cn.iocoder.yudao.module.member.service.diningplates.DiningPlatesService;
import cn.iocoder.yudao.module.member.service.orderdetaillog.OrderDetailLogService;
import cn.iocoder.yudao.module.member.util.MemberTimeUtils;
import cn.iocoder.yudao.module.system.api.dish.DishesApi;
import cn.iocoder.yudao.module.system.api.dish.dto.DishesRespDto;
@ -66,6 +69,8 @@ public class OrderDetailServiceImpl implements OrderDetailService {
private HttpServletRequest httpServletRequest;
@Resource
private MemberAsyncService asyncService;
@Resource
private OrderDetailLogService orderDetailLogService;
@Override
@ -81,6 +86,11 @@ public class OrderDetailServiceImpl implements OrderDetailService {
diningPlatesDO.setDiningPlatesNum(createReqVO.getDiningPlatesNum());
diningPlatesService.insertDiningPlates(diningPlatesDO);
}
//计算新总价
DishesRespDto dish = dishesApi.getDish(createReqVO.getDishesId());
if(createReqVO.getWeight().compareTo(new BigDecimal(dish.getErrorNum()))<=0){
return 0L;
}
if(diningPlatesDO.getOrderId() == null){
//创建初始订单
@ -93,8 +103,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
diningPlatesDO.setStatus(DiningPlatesDO.USE);
diningPlatesMapper.updateById(diningPlatesDO);
}
//计算新总价
DishesRespDto dish = dishesApi.getDish(createReqVO.getDishesId());
String old = stringRedisTemplate.opsForValue().get(createReqVO.getDiningPlatesNum()+"-" +createReqVO.getStoreId());
BigDecimal oldBigDecimal = new BigDecimal(StrUtil.isBlank(old)?"0":old);
//计算每个菜品的价格
@ -103,15 +112,22 @@ public class OrderDetailServiceImpl implements OrderDetailService {
BigDecimal newPrice = bigDecimal1.add(oldBigDecimal).setScale(2, RoundingMode.HALF_UP);
stringRedisTemplate.opsForValue().set(createReqVO.getDiningPlatesNum() + "-" +createReqVO.getStoreId(), newPrice.toString());
OtherVO otherVO = new OtherVO();
otherVO.setSn(getHearder());
String header = getHearder();
otherVO.setSn(header);
otherVO.setOrderId(diningPlatesDO.getOrderId());
otherVO.setDishesName(dish.getDishesName());
otherVO.setDishesImageUrl(dish.getDishesImageUrl());
otherVO.setPrice(bigDecimal1);
otherVO.setUnitPrice(dish.getDishesSumPrice());
asyncService.createOrderDetail(createReqVO,otherVO);
//记录日志
OrderDetailLogSaveReqVO orderDetailLogSaveReqVO = new OrderDetailLogSaveReqVO();
orderDetailLogSaveReqVO.setStoreId(createReqVO.getStoreId());
orderDetailLogSaveReqVO.setDeviceSn(header);
orderDetailLogSaveReqVO.setParam(JSONUtil.toJsonStr(createReqVO));
orderDetailLogSaveReqVO.setInsertParam(JSONUtil.toJsonStr(otherVO));
orderDetailLogService.createOrderDetailLog(orderDetailLogSaveReqVO);
// 返回写死
return 0L;
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.member.service.orderdetaillog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.OrderDetailLogPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.OrderDetailLogSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetaillog.OrderDetailLogDO;
import javax.validation.Valid;
/**
* 打菜日志 Service 接口
*
* @author 我是秦俊旗
*/
public interface OrderDetailLogService {
/**
* 创建打菜日志
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createOrderDetailLog(@Valid OrderDetailLogSaveReqVO createReqVO);
/**
* 更新打菜日志
*
* @param updateReqVO 更新信息
*/
void updateOrderDetailLog(@Valid OrderDetailLogSaveReqVO updateReqVO);
/**
* 删除打菜日志
*
* @param id 编号
*/
void deleteOrderDetailLog(Long id);
/**
* 获得打菜日志
*
* @param id 编号
* @return 打菜日志
*/
OrderDetailLogDO getOrderDetailLog(Long id);
/**
* 获得打菜日志分页
*
* @param pageReqVO 分页查询
* @return 打菜日志分页
*/
PageResult<OrderDetailLogDO> getOrderDetailLogPage(OrderDetailLogPageReqVO pageReqVO);
}

View File

@ -0,0 +1,71 @@
package cn.iocoder.yudao.module.member.service.orderdetaillog;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.OrderDetailLogPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.orderdetaillog.vo.OrderDetailLogSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.orderdetaillog.OrderDetailLogDO;
import cn.iocoder.yudao.module.member.dal.mysql.orderdetaillog.OrderDetailLogMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.ORDER_DETAIL_LOG_NOT_EXISTS;
/**
* 打菜日志 Service 实现类
*
* @author 我是秦俊旗
*/
@Service
@Validated
public class OrderDetailLogServiceImpl implements OrderDetailLogService {
@Resource
private OrderDetailLogMapper orderDetailLogMapper;
@Override
public Long createOrderDetailLog(OrderDetailLogSaveReqVO createReqVO) {
// 插入
OrderDetailLogDO orderDetailLog = BeanUtils.toBean(createReqVO, OrderDetailLogDO.class);
orderDetailLogMapper.insert(orderDetailLog);
// 返回
return orderDetailLog.getId();
}
@Override
public void updateOrderDetailLog(OrderDetailLogSaveReqVO updateReqVO) {
// 校验存在
validateOrderDetailLogExists(updateReqVO.getId());
// 更新
OrderDetailLogDO updateObj = BeanUtils.toBean(updateReqVO, OrderDetailLogDO.class);
orderDetailLogMapper.updateById(updateObj);
}
@Override
public void deleteOrderDetailLog(Long id) {
// 校验存在
validateOrderDetailLogExists(id);
// 删除
orderDetailLogMapper.deleteById(id);
}
private void validateOrderDetailLogExists(Long id) {
if (orderDetailLogMapper.selectById(id) == null) {
throw exception(ORDER_DETAIL_LOG_NOT_EXISTS);
}
}
@Override
public OrderDetailLogDO getOrderDetailLog(Long id) {
return orderDetailLogMapper.selectById(id);
}
@Override
public PageResult<OrderDetailLogDO> getOrderDetailLogPage(OrderDetailLogPageReqVO pageReqVO) {
return orderDetailLogMapper.selectPage(pageReqVO);
}
}

View File

@ -41,5 +41,7 @@ public class DishesRespDto {
*/
private BigDecimal dishesNumber;
private Integer errorNum;
}