/** * 重置(还原出厂设置) * * @param error * @return */ public static int reset(ErrorInfo error) { error.clear(); String backupFileName = backup(false, error); if (null == backupFileName) { return error.code; } if (0 != createOperation(DBOperationType.RESET, backupFileName, error)) { return error.code; } DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.DB_RESET, "还原出厂初始数据", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } if (0 != MySQLTool.executeSqlFile( username, password, host, port, database, resetFileName, error)) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "还原出厂设置成功"; return error.code; }
/** * 还原数据库 * * @param fileName * @param error * @return */ public static int recover(String fileName, ErrorInfo error) { error.clear(); if (StringUtils.isBlank(fileName)) { error.code = -1; error.msg = "恢复文件不能为空"; return error.code; } String backupFileName = backup(false, error); if (null == backupFileName) { return error.code; } if (0 != createOperation(DBOperationType.RECOVER, backupFileName, error)) { return error.code; } DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.DB_RECOVER, "还原运营数据", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } String decryptFileName = Constants.SQL_PATH + UUID.randomUUID().toString() + ".sql"; if (!FileEncrypt.decrypt(fileName, decryptFileName, Constants.ENCRYPTION_KEY)) { error.code = -1; error.msg = "还原数据库失败"; return error.code; } if (0 != MySQLTool.executeSqlFile( username, password, host, port, database, decryptFileName, error)) { JPA.setRollbackOnly(); return error.code; } if (!new File(decryptFileName).delete()) { error.code = -1; error.msg = "还原数据库失败"; return error.code; } error.code = 0; error.msg = "还原数据库成功"; return error.code; }
/** * 上架/下架 * * @param pid 产品ID * @param isUse 状态值 * @param error 信息值 * @return ? > 0 : success; ? < 0 : fail */ public static void editStatus(long pid, boolean isUse, ErrorInfo error) { error.clear(); String hql = "update t_products set is_use=? where id=?"; Query query = JPA.em().createQuery(hql); query.setParameter(1, isUse); query.setParameter(2, pid); int rows = 0; try { rows = query.executeUpdate(); } catch (Exception e) { e.printStackTrace(); Logger.error("产品->上架/下架:" + e.getMessage()); error.msg = error.FRIEND_INFO + "上架/下架失败!"; return; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "设置失败!"; return; } /* 添加事件 */ if (isUse) { DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.ENABLE_PRODUCT, "启用借款标产品", error); } else { DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.ENABLE_PRODUCT, "暂停借款标产品", error); } if (error.code < 0) { JPA.setRollbackOnly(); error.msg = "设置失败!"; return; } }
/** * 改变合作机构状态(正常/暂停) * * @param aid 机构ID * @param isUse 正常/暂停 * @param error 信息值 */ public static void editStatus(long aid, boolean isUse, ErrorInfo error) { error.clear(); String hql = "update t_agencies set is_use=? where id=?"; Query query = JPA.em().createQuery(hql); query.setParameter(1, isUse); query.setParameter(2, aid); int rows = 0; try { rows = query.executeUpdate(); } catch (Exception e) { e.printStackTrace(); Logger.error("合作机构->正常/暂停:" + e.getMessage()); error.msg = error.FRIEND_INFO + "设置失败!"; return; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "设置失败!"; return; } /* 添加事件 */ if (isUse) DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.ENABLE_AGENCY, "启用合作机构", error); else DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.NOT_ENABLE_AGENCY, "暂停合作机构", error); if (error.code < 0) { JPA.setRollbackOnly(); error.msg = "设置失败!"; return; } error.code = 0; }
/** * 编辑安全保障 * * @param supervisorId * @param error * @return */ public int updateAdsEnsure(long supervisorId, long adsId, ErrorInfo error) { error.clear(); t_content_advertisements_ensure ensure = null; try { ensure = t_content_advertisements_ensure.findById(adsId); } catch (Exception e) { e.printStackTrace(); Logger.info("编辑广告条,根据广告ID查询广告信息时:" + e.getMessage()); error.code = -1; error.msg = "查询广告条失败"; return error.code; } ensure.title = this.title; ensure.location = this.location; ensure.file_size = "不超过2M"; ensure.resolution = this.resolution; ensure.file_size = this.fileSize; ensure.file_format = this.fileFormat; ensure.url = this.url; ensure.is_link_enabled = this.isLinkEnabled; ensure.target = this.target; ensure.image_filename = this.imageFileName; ensure.is_use = this.status; try { ensure.save(); } catch (Exception e) { e.printStackTrace(); Logger.info("编辑安全保障,保存编辑安全保障信息时:" + e.getMessage()); error.msg = "编辑安全保障失败"; return -1; } DealDetail.supervisorEvent(supervisorId, SupervisorEvent.EDIT_ENSURE, "编辑安全保障", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "编辑安全保障成功"; return 0; }
/** * 添加 * * @param info 信息值 * @return ? > 0 : success; ? < 0 : fail */ public void create(ErrorInfo error) { error.clear(); t_products product = new t_products(); product.is_use = Constants.ENABLE; product.is_agency = Constants.NOT_IS_AGENCY; // product.fee_description = this.feeDescription; // 手续费描述(常量值读取拼接,无需编辑) /* 添加基本信息 */ error.code = this.addOrEdit(product); if (error.code < 0) { error.code = -1; error.msg = error.FRIEND_INFO + "添加基本信息失败!"; return; } /* 添加对应的审核资料 */ error.code = this.addProductAudit(product.id, product.mark); if (error.code < 0) { error.code = -2; error.msg = error.FRIEND_INFO + "添加审核资料失败!"; return; } /* 添加标签和字段 */ error.code = this.addProductLableAndFiled(product.id, error); if (error.code < 0) { error.code = -3; error.msg = error.FRIEND_INFO + "添加产品标签/字段失败!"; return; } /* 添加事件 */ DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.CREATE_PRODUCT, "添加产品", error); if (error.code < 0) { JPA.setRollbackOnly(); error.msg = "保存失败!"; return; } }
/** * 编辑类别 * * @param supvisorId * @param typeId * @param error * @return */ public int editType(long supervisorId, long id, ErrorInfo error) { error.clear(); t_content_news_types type = null; try { type = t_content_news_types.findById(id); } catch (Exception e) { e.printStackTrace(); Logger.info("编辑类别,查询类别时:" + e.getMessage()); error.code = -1; error.msg = "编辑类别失败"; return error.code; } type.name = this.name; type.description = this.description; type._order = this.order; try { type.save(); } catch (Exception e) { e.printStackTrace(); Logger.info("编辑类别,更新类别时:" + e.getMessage()); error.code = -2; error.msg = "编辑类别失败"; return error.code; } DealDetail.supervisorEvent(supervisorId, SupervisorEvent.EDIT_NEWSTYPE, "编辑类别", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "更新类别成功"; return 0; }
/** 添加合作机构 */ public void createAgency(ErrorInfo error) { t_agencies agency = new t_agencies(); agency.time = new Date(); // 当前时间 agency.name = this.name; agency.credit_level = this.creditLevel; agency.introduction = this.introduction; agency.id_number = this.id_number; agency.imageFilenames = this.imageFilenames; // 借款图片 agency.is_use = Constants.ENABLE; // 默认为启动 try { agency.save(); } catch (Exception e) { e.printStackTrace(); Logger.error("合作机构->添加合作机构:" + e.getMessage()); error.msg = "添加失败!"; this._id = -1; return; } if (agency.id < 0) { error.msg = "添加失败!"; return; } /* 添加事件 */ DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.CREATE_AGENCY, "添加合作机构", error); if (error.code < 0) { JPA.setRollbackOnly(); error.msg = "添加失败!"; return; } error.code = 0; }
/** * 备份数据库 * * @param isVisual 是否在数据库操作记录表中可见 * @param error * @return */ public static String backup(boolean isVisual, ErrorInfo error) { error.clear(); String fileName = Constants.SQL_PATH + UUID.randomUUID().toString(); FileUtil.getStore(Constants.SQL_PATH); if (0 != MySQLTool.dumpSqlFile(username, password, host, port, database, fileName, error)) { return null; } if (!FileEncrypt.encrypt(fileName, Constants.ENCRYPTION_KEY)) { error.code = -1; error.msg = "备份数据库失败"; return null; } if (isVisual) { if (0 != createOperation(DBOperationType.BACKUP, fileName, error)) { return null; } DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.DB_BACKUP, "备份数据", error); if (error.code < 0) { JPA.setRollbackOnly(); return null; } } error.code = 0; error.msg = "备份数据库成功"; return fileName; }
/** * 删除类别 * * @param supervisorId * @param type * @param error */ public static void deleteType(long supervisorId, Long[] types, ErrorInfo error) { error.clear(); if (types == null || types.length == 0) { error.code = -1; error.msg = "请选择要删除的类别"; return; } StringBuffer typeString = new StringBuffer("("); for (int i = 0; i < types.length; i++) { typeString.append("?,"); } typeString.replace(typeString.length() - 1, typeString.length(), ")"); String sql = "delete from t_content_news_types as type where type.id in " + typeString.toString(); String sql2 = "delete from t_content_news as news where news.type_id in " + typeString.toString(); Query query = JPA.em().createQuery(sql); Query query2 = JPA.em().createQuery(sql2); for (int i = 0; i < types.length; i++) { query.setParameter(i + 1, types[i]); query2.setParameter(i + 1, types[i]); } int rows1 = 0; try { rows1 = query.executeUpdate(); query2.executeUpdate(); } catch (Exception e) { JPA.setRollbackOnly(); e.printStackTrace(); Logger.info("删除类别时:" + e.getMessage()); error.code = -1; error.msg = "删除类别时出现异常"; return; } if (rows1 == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "数据未更新"; return; } DealDetail.supervisorEvent(supervisorId, SupervisorEvent.DEL_NEWSTYPE, "删除类别", error); if (error.code < 0) { JPA.setRollbackOnly(); return; } error.code = 0; error.msg = "类别删除成功"; }
/** * 显示类别(该类别的子类别也跟着显示) * * @param supvisorId 管理员id * @param typeId 隐藏类别的id * @param error * @return */ public static int showType(long supvisorId, long typeId, ErrorInfo error) { error.clear(); // String sql = "select status from t_content_news_types where id = ?"; // boolean status = false; // // try { // status = t_content_news_types.find(sql, typeId).first(); // } catch(Exception e) { // e.printStackTrace(); // error.msg = "查询类别状态失败"; // return -1; // } // // if(status) { // error.msg = "该类别已是显示状态"; // return -1; // } EntityManager em = JPA.em(); String mySql = "update t_content_news_types set status = ? where id = ?"; int rows = 0; try { rows = em.createQuery(mySql).setParameter(1, true).setParameter(2, typeId).executeUpdate(); } catch (Exception e) { e.printStackTrace(); Logger.info("显示类别,更新类别状态时:" + e.getMessage()); error.code = -1; error.msg = "更新类别状态失败"; return error.code; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "数据未更新"; return error.code; } /* * 递归修改子类别的属性 */ String sql2 = "select id from t_content_news_types where parent_id = ?"; List<Long> ids = null; try { ids = t_content_news_types.find(sql2, typeId).fetch(); } catch (Exception e) { e.printStackTrace(); Logger.info("显示类别,查询子类别时:" + e.getMessage()); error.code = -2; error.msg = "更新类别状态失败"; return error.code; } if (ids != null && ids.size() != 0) { for (long id : ids) { showType(supvisorId, id, error); } } DealDetail.supervisorEvent(supvisorId, SupervisorEvent.SHOW_NEWSTYPE, "显示类别", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "更新类别状态成功"; return 0; }
/** * 添加类别 * * @param supvisorId 管理员id * @param error * @return */ public int addChildType(long supervisorId, ErrorInfo error) { error.clear(); if (this._parentId <= 0) { error.code = -1; error.msg = "请选择父类别"; return error.code; } if (StringUtils.isBlank(name)) { error.code = -1; error.msg = "请输入类别名称"; return error.code; } if (this.order <= 0) { error.code = -1; error.msg = "请输入排序"; return error.code; } if (NewsType.orderExist(this._parentId, order, error)) { return error.code; } t_content_news_types childType = new t_content_news_types(); childType.parent_id = this._parentId; childType.name = this.name; childType.description = this.description; childType.status = Constants.TRUE; childType._order = this.order; try { childType.save(); } catch (Exception e) { e.printStackTrace(); Logger.info("添加添加类别时,保存添加的类别时:" + e.getMessage()); error.code = -1; error.msg = "添加类别失败"; return -1; } DealDetail.supervisorEvent(supervisorId, SupervisorEvent.ADD_NEWSTYPE, "添加类别", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "添加类别成功"; this._id = childType.id; return 0; }
/** * @param time 申请vip的时长,月为单位 * @param user * @param info * @return */ public int renewal(User user, ErrorInfo error) { error.clear(); BackstageSet backstageSet = BackstageSet.getCurrentBackstageSet(); int vipMinTimeType = backstageSet.vipMinTimeType; int vipMinTime = backstageSet.vipMinTimeLength; int vipTimeType = backstageSet.vipTimeType; double vipFee = backstageSet.vipFee; if (vipMinTimeType != 1) { vipMinTime *= 12; } if (this.serviceTime < vipMinTime) { error.code = -3; error.msg = "vip开通不能少于最少时长"; return error.code; } int timeLen = this.serviceTime; double fee = 0; if (vipTimeType == 1) { fee = vipFee * timeLen; } else if (vipTimeType == 0) { fee = Arith.mul(vipFee, serviceTime / 12); } fee = fee * backstageSet.vipDiscount / 10; fee = Arith.round(fee, 2); DataSafety data = new DataSafety(); data.id = user.id; if (!data.signCheck(error)) { JPA.setRollbackOnly(); return error.code; } v_user_for_details forDetail = DealDetail.queryUserBalance(user.id, error); if (error.code < 0) { return error.code; } if (Constants.IPS_ENABLE) { switch (Constants.PAY_TYPE_VIP) { // 平台内部进行转账 case PayType.INNER: error.code = -1; error.msg = "资金托管模式下,不能以平台内部进行转账的方式支付"; return error.code; // 通过独立普通网关 case PayType.INDEPENDENT: if (fee > user.balance2) { error.code = Constants.BALANCE_NOT_ENOUGH; error.msg = "对不起,您可用余额不足"; Map<String, Object> map = new HashMap<String, Object>(); map.put("rechargeType", RechargeType.VIP); map.put("serviceTime", timeLen); map.put("fee", fee); Cache.set("rechargePay" + user.id, map, IPSConstants.CACHE_TIME); return error.code; } break; // 通过共享资金托管账户网关 case PayType.SHARED: // 资金托管网关 case PayType.IPS: if (this.isPay) { break; } if (fee > user.balance) { error.code = Constants.BALANCE_NOT_ENOUGH; error.msg = "对不起,您可用余额不足"; return error.code; } if (fee > 0) { error.code = Constants.BALANCE_PAY_ENOUGH; error.msg = "请前去支付VIP费用"; Map<String, Object> map = new HashMap<String, Object>(); map.put("rechargeType", RechargeType.VIP); map.put("serviceTime", timeLen); map.put("fee", fee); Cache.set("rechargePay" + user.id, map, IPSConstants.CACHE_TIME); return error.code; } break; } } else { if (fee > user.balance) { error.code = Constants.BALANCE_NOT_ENOUGH; error.msg = "对不起,您可用余额不足"; Map<String, Object> map = new HashMap<String, Object>(); map.put("rechargeType", RechargeType.VIP); map.put("serviceTime", timeLen); map.put("fee", fee); Cache.set("rechargePay" + user.id, map, IPSConstants.CACHE_TIME); return error.code; } } t_user_vip_records vipRecord = new t_user_vip_records(); t_user_vip_records record = null; int rows = 0; if (user.vipStatus) { try { record = t_user_vip_records.find("user_id = ? and status = 1", user.id).first(); rows = JpaHelper.execute( "update t_user_vip_records set status = 0 where user_id = ? and status = 1") .setParameter(1, user.id) .executeUpdate(); } catch (Exception e) { e.printStackTrace(); Logger.info("申请vip时,查询系统设置中的vip设置时" + e.getMessage()); error.code = -1; error.msg = "申请vip失败"; return error.code; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "数据未更新,vip申请失败"; return error.code; } vipRecord.start_time = record.expiry_date; vipRecord.expiry_date = DateUtil.dateAddMonth(record.expiry_date, this.serviceTime); } else { vipRecord.start_time = new Date(); vipRecord.expiry_date = DateUtil.dateAddMonth(new Date(), this.serviceTime); } vipRecord.user_id = user.id; vipRecord.time = new Date(); vipRecord.service_fee = fee; vipRecord.status = true; try { JpaHelper.execute("update t_user_vip_records set status = 0 where user_id = ? and status = 1") .setParameter(1, user.id) .executeUpdate(); vipRecord.save(); rows = JpaHelper.execute("update t_users set vip_status = true where id = ?", user.id) .executeUpdate(); } catch (Exception e) { JPA.setRollbackOnly(); e.printStackTrace(); Logger.info("申请vip时,查询系统设置中的vip设置时" + e.getMessage()); error.code = -5; error.msg = "申请vip失败"; return error.code; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "数据未更新"; return error.code; } // 更新用户资金 if (Constants.PAY_TYPE_VIP == PayType.INDEPENDENT) { error.code = DealDetail.minusUserFund2(user.id, fee); } else { error.code = DealDetail.minusUserFund(user.id, fee); } if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } DealDetail dealDetail = null; forDetail = DealDetail.queryUserBalance(user.id, error); /* 添加交易记录 */ if (Constants.PAY_TYPE_VIP == PayType.INDEPENDENT) { dealDetail = new DealDetail( user.id, DealType.CHARGE_VIP, fee, vipRecord.id, forDetail.user_amount2, forDetail.freeze, forDetail.receive_amount, "vip扣费"); dealDetail.addDealDetail2(error); } else { dealDetail = new DealDetail( user.id, DealType.CHARGE_VIP, fee, vipRecord.id, forDetail.user_amount, forDetail.freeze, forDetail.receive_amount, "vip扣费"); dealDetail.addDealDetail(error); } if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } data.id = user.id; data.updateSign(error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } DealDetail.addPlatformDetail( DealType.VIP_FEE, vipRecord.id, user.id, -1, DealType.ACCOUNT, fee, 1, "vip费用", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } DealDetail.userEvent(this.id, UserEvent.VIP, "申请vip", error); if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } // vip申请站内信 TemplateStation station = new TemplateStation(); station.id = Templets.M_VIP_SUCCESS; if (station.status) { TemplateStation.addMessageTask( userId, station.title, station.content.replace("vipFee", fee + "")); } // 发送邮件 TemplateEmail email = new TemplateEmail(); email.id = Templets.E_VIP_SUCCESS; if (email.status) { TemplateEmail.addEmailTask( user.email, email.title, email.content.replace("vipFee", fee + "")); } // 发送短信 TemplateSms sms = new TemplateSms(); if (StringUtils.isNotBlank(user.mobile)) { sms.id = Templets.S_VIP_SUCCESS; if (sms.status) { TemplateSms.addSmsTask( user.mobile, sms.content .replace("vipFee", fee + "") .replace("userName", user.name) .replace("date", DateUtil.dateToString(new Date()))); } } if (Constants.IPS_ENABLE) { user.balance2 = forDetail.user_amount2 - fee; } else { user.balance = forDetail.user_amount - fee; } user.vipStatus = true; User.setCurrUser(user); error.code = 0; error.msg = "申请vip成功!"; return error.code; }
/** * 启用安全保障 * * @param supervisorId * @param id * @param error * @return */ public static int updateAdsEnsureStatus( long supervisorId, String idStr, String statusStr, ErrorInfo error) { error.clear(); if (!NumberUtil.isNumericInt(idStr)) { error.code = -1; error.msg = "传入广告条参数有误!"; return error.code; } if (!NumberUtil.isNumericInt(statusStr)) { error.code = -2; error.msg = "传入广告条参数有误!"; return error.code; } int statusInt = Integer.parseInt(statusStr); if (statusInt != 0 && statusInt != 1) { error.code = -2; error.msg = "传入广告条参数有误!"; return error.code; } boolean status = statusInt == 0 ? false : true; long adsId = Long.parseLong(idStr); String sql = "update t_content_advertisements_ensure set is_use = ? where id = ?"; EntityManager em = JPA.em(); Query query = em.createQuery(sql).setParameter(1, !status).setParameter(2, adsId); int rows = 0; try { rows = query.executeUpdate(); } catch (Exception e) { JPA.setRollbackOnly(); e.printStackTrace(); Logger.info("更新安全保障,更新安全保障信息时:" + e.getMessage()); error.msg = "更新安全保障失败"; return -1; } if (rows == 0) { JPA.setRollbackOnly(); error.code = -1; error.msg = "数据未更新"; return error.code; } if (status == false) { DealDetail.supervisorEvent( supervisorId, SupervisorEvent.OPEN_USE_ENSURE, "启用四大安全保障使用", error); } else { DealDetail.supervisorEvent( supervisorId, SupervisorEvent.CLOSE_USE_ENSURE, "关闭四大安全保障使用", error); } if (error.code < 0) { JPA.setRollbackOnly(); return error.code; } error.code = 0; error.msg = "更新安全保障成功"; return 0; }
/** * 编辑 * * @param id 产品ID * @param error 信息值 * @return ? > 0 : success; ? < 0 : fail */ public void edit(long id, ErrorInfo error) { error.clear(); t_products product = null; try { product = t_products.findById(id); } catch (Exception e) { e.printStackTrace(); Logger.error("产品->编辑:" + e.getMessage()); error.code = -1; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } if (null == product) { error.code = -2; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } /* 添加基本信息 */ error.code = this.addOrEdit(product); if (error.code < 0) { error.code = -3; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } /* 删除作废的审核资料 */ error.code = ProductAuditItem.deleteProductAudit(id); if (error.code < 0) { error.code = -4; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } /* 添加对应的审核资料 */ error.code = this.addProductAudit(id, product.mark); if (error.code < 0) { error.code = -5; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } /* 编辑标签和字段 */ error.code = this.editFiledConten(); if (error.code < 0) { error.code = -6; error.msg = error.FRIEND_INFO + "编辑失败!"; return; } /* 添加事件 */ DealDetail.supervisorEvent( Supervisor.currSupervisor().id, SupervisorEvent.EDIT_PRODUCT, "编辑产品", error); if (error.code < 0) { JPA.setRollbackOnly(); error.msg = "保存失败!"; return; } }