资格预审功能开发

This commit is contained in:
xd 2024-07-22 14:18:33 +08:00
parent 7f850ef296
commit e0fbba9ebd
28 changed files with 2330 additions and 46 deletions

View File

@ -1,5 +1,5 @@
#for tests only !
#Tue Jul 16 09:48:52 CST 2024
#Mon Jul 22 13:35:56 CST 2024
jco.destination.pool_capacity=10
jco.client.lang=ZH
jco.client.ashost=172.19.0.125
@ -7,5 +7,5 @@ jco.client.saprouter=
jco.client.user=RFC
jco.client.sysnr=00
jco.destination.peak_limit=10
jco.client.passwd=fIIvwvEBHbcBvFB_tS(Vu[3tV[6as:m0)kkAT/TIkq(z)5~9
jco.client.passwd=d5-l}25LC/syTMZBj},zzcOyD{}`D$_}M#F{]EU?5=[as!f`
jco.client.client=800

View File

@ -15,6 +15,7 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.MinioUtil;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.changeRecord.ChangeRecordLog;
import com.ruoyi.quot.domain.Quot;
import com.ruoyi.redBook.domain.OAQuot;
import com.ruoyi.redBook.domain.RbVersionDateResult;
@ -66,6 +67,9 @@ public class BidController extends BaseController
* 分派
*/
@PreAuthorize("@ss.hasPermi('bid:bid:assign')")
@ChangeRecordLog(serviceImplclass = "com.ruoyi.bid.service.impl.BidServiceImpl",
serviceImplMethod="selectBidByBidId",
tableId = "bidId",codeName = "bidCode")
@Log(title = "分派投标信息", businessType = BusinessType.EXPORT)
@PostMapping("/bidAssign")
public AjaxResult bidAssign(@RequestBody Bid bid)
@ -110,7 +114,7 @@ public class BidController extends BaseController
* 导出投标信息列表
*/
@PreAuthorize("@ss.hasPermi('bid:bid:export')")
@Log(title = "投标信息", businessType = BusinessType.EXPORT)
@Log(title = "投标信息导出", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Bid bid)
{
@ -133,7 +137,7 @@ public class BidController extends BaseController
* 新增投标信息
*/
@PreAuthorize("@ss.hasPermi('bid:bid:add')")
@Log(title = "投标信息", businessType = BusinessType.INSERT)
@Log(title = "投标信息新增", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Bid bid)
{
@ -150,7 +154,10 @@ public class BidController extends BaseController
* 修改投标信息
*/
@PreAuthorize("@ss.hasPermi('bid:bid:edit')")
@Log(title = "投标信息", businessType = BusinessType.UPDATE)
@ChangeRecordLog(serviceImplclass = "com.ruoyi.bid.service.impl.BidServiceImpl",
serviceImplMethod="selectBidByBidId",
tableId = "bidId",codeName = "bidCode")
@Log(title = "投标信息修改", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Bid bid)
{
@ -167,7 +174,7 @@ public class BidController extends BaseController
* @throws Exception
*/
@PreAuthorize("@ss.hasAnyPermi('bid:bid:bidYwyFile,bid:bid:bidTbbFile')")
@Log(title = "上传报价附件", businessType = BusinessType.INSERT)
@Log(title = "上传投标附件", businessType = BusinessType.INSERT)
@PostMapping("/bidFile")
public AjaxResult bidFile(@RequestParam("bidFile") MultipartFile file, @RequestParam("relation_id") String relation_id, @RequestParam("file_type") String file_type) throws Exception
{
@ -194,7 +201,7 @@ public class BidController extends BaseController
bidFileService.insertBidFile(bidFile);
}
}else{
return error("系统异常,报价单号为空!");
return error("系统异常,投标单号为空!");
}
return success("上传成功!");
}
@ -234,6 +241,9 @@ public class BidController extends BaseController
* 提交OA事业部经理店长/投标办按钮
*/
@PreAuthorize("@ss.hasPermi('bid:bid:commit')")
@ChangeRecordLog(serviceImplclass = "com.ruoyi.bid.service.impl.BidServiceImpl",
serviceImplMethod="selectBidByBidId",
tableId = "bidId",codeName = "bidCode")
@Log(title = "提交投标办", businessType = BusinessType.OTHER)
@PostMapping("/commitTbxx")
public AjaxResult commitTbxx(@RequestBody Bid bid)
@ -345,6 +355,9 @@ public class BidController extends BaseController
* 投标提交技术协助
*/
@PreAuthorize("@ss.hasPermi('bid:bid:assist')")
@ChangeRecordLog(serviceImplclass = "com.ruoyi.bid.service.impl.BidServiceImpl",
serviceImplMethod="selectBidByBidId",
tableId = "bidId",codeName = "bidCode")
@Log(title = "投标提交技术协助", businessType = BusinessType.OTHER)
@PostMapping("/commitJsBid")
public AjaxResult commitJsBid(@RequestBody Bid bid)
@ -394,10 +407,10 @@ public class BidController extends BaseController
bidJsqr.setCreateBy(getUsername());
bidJsqr.setUpdateBy(getUsername());
bidJsqrService.insertBidJsqr(bidJsqr);//生成报价-技术确认单
bidJsqrService.insertBidJsqr(bidJsqr);//生成投标-技术确认单
bid.setBidJsxzConfirmId(bidJsqrId);
bid.setBidJsxzApprovalStatus("1");//报价-技术确认单 状态设置为 协助中
bid.setBidJsxzApprovalStatus("1");//投标-技术确认单 状态设置为 协助中
bidService.updateBid(bid);
//sendNoticeToJsxz(bidJsqr);
@ -409,6 +422,9 @@ public class BidController extends BaseController
* 投标驳回
*/
@PreAuthorize("@ss.hasPermi('bid:bid:reject')")
@ChangeRecordLog(serviceImplclass = "com.ruoyi.bid.service.impl.BidServiceImpl",
serviceImplMethod="selectBidByBidId",
tableId = "bidId",codeName = "bidCode")
@Log(title = "投标驳回", businessType = BusinessType.OTHER)
@PostMapping("/rejectBid")
public AjaxResult rejectBid(@RequestBody Bid bid)

View File

@ -0,0 +1,37 @@
package com.ruoyi.web.controller.system;
import com.ruoyi.system.domain.SysChangeRecord;
import com.ruoyi.system.domain.SysNoticeUser;
import com.ruoyi.system.mapper.SysChangeRecordMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
/**
* 业务单据变更记录
*
* @author ruoyi
*/
@RestController
@RequestMapping("/system/changeRecord")
public class SysChangeRecordController {
@Autowired
private SysChangeRecordMapper changeRecordMapper;
/**
* 导航面板 消息通知-更多
* @return
*/
@GetMapping("/recordsList")
public List<SysChangeRecord> recordsList(SysChangeRecord sysChangeRecord)
{
List<SysChangeRecord> list = changeRecordMapper.recordsList(sysChangeRecord);
list.sort((t1, t2) -> t2.getChangeTime().compareTo(t1.getChangeTime()));
return list;
}
}

View File

@ -0,0 +1,117 @@
package com.ruoyi.web.controller.zgys;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.framework.changeRecord.ChangeRecordLog;
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.zgys.domain.Zgys;
import com.ruoyi.zgys.service.IZgysService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 资格预审Controller
*
* @author ruoyi
* @date 2024-07-22
*/
@RestController
@RequestMapping("/zgys/zgys")
public class ZgysController extends BaseController
{
@Autowired
private IZgysService zgysService;
/**
* 查询资格预审列表
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:list')")
@GetMapping("/list")
public TableDataInfo list(Zgys zgys)
{
startPage();
List<Zgys> list = zgysService.selectZgysList(zgys);
return getDataTable(list);
}
/**
* 导出资格预审列表
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:export')")
@Log(title = "资格预审导出", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, Zgys zgys)
{
List<Zgys> list = zgysService.selectZgysList(zgys);
ExcelUtil<Zgys> util = new ExcelUtil<Zgys>(Zgys.class);
util.exportExcel(response, list, "资格预审数据");
}
/**
* 获取资格预审详细信息
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:query')")
@GetMapping(value = "/{pqId}")
public AjaxResult getInfo(@PathVariable("pqId") String pqId)
{
return success(zgysService.selectZgysByPqId(pqId));
}
/**
* 新增资格预审
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:add')")
@Log(title = "资格预审新增", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody Zgys zgys)
{
zgys.setPqId(UUID.fastUUID().toString());
String bidCode = zgysService.getCode("TBXX");
zgys.setPqCode(bidCode);
zgys.setCreateBy(getUsername());
zgys.setUpdateBy(getUsername());
zgysService.insertZgys(zgys);
return success(zgys);
}
/**
* 修改资格预审
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:edit')")
@ChangeRecordLog(serviceImplclass = "com.ruoyi.zgys.service.impl.ZgysServiceImpl",
serviceImplMethod="selectZgysByPqId",
tableId = "pqId",codeName = "pqCode")
@Log(title = "资格预审修改", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody Zgys zgys)
{
zgys.setUpdateBy(getUsername());
return toAjax(zgysService.updateZgys(zgys));
}
/**
* 删除资格预审
*/
@PreAuthorize("@ss.hasPermi('zgys:zgys:remove')")
@Log(title = "资格预审删除", businessType = BusinessType.DELETE)
@DeleteMapping("/{pqIds}")
public AjaxResult remove(@PathVariable String[] pqIds)
{
return toAjax(zgysService.deleteZgysByPqIds(pqIds));
}
}

View File

@ -0,0 +1,198 @@
package com.ruoyi.framework.changeRecord;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.ruoyi.common.annotation.DataName;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysChangeRecord;
import com.ruoyi.system.mapper.SysChangeRecordMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@Aspect
@Component
@Slf4j
@SuppressWarnings("all")
public class ChangeRecordAspect {
@Autowired
private SysChangeRecordMapper changeRecordMapper;
@Autowired
private ApplicationContext applicationContext;
//保存修改之前的数据
Map<String, Object> oldMap = new HashMap<>();
/**
* 处理请求前执行
*/
@Before(value = "@annotation(operateLog)")
public void boBefore(JoinPoint joinPoint, ChangeRecordLog operateLog) throws Exception {
ContentParser contentParser = (ContentParser) applicationContext.getBean(operateLog.parseclass());
//旧值
Object oldObject = contentParser.getResult(joinPoint, operateLog, operateLog.tableId());
if (operateLog.needDefaultCompare()) {
oldMap = (Map<String, Object>) objectToMap(oldObject); // 存储修改前的对象
}
}
/**
* 处理请求后执行
* @param joinPoint
* @param operateLog
* @throws Throwable
*/
@After("@annotation(operateLog)")
public void around(JoinPoint joinPoint, ChangeRecordLog operateLog) throws Throwable {
try {
SysChangeRecord changeRecord = new SysChangeRecord();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod(); // 获取切入点所在的方法
String meName = method.getName(); // 获取请求的方法名
String className = joinPoint.getTarget().getClass().getName(); // 获取请求的类名
String methodName = className + "." + meName;
String uri = request.getRequestURL().toString(); // 请求uri
Object[] args = joinPoint.getArgs();
// 请求参数 预留
//String requestParams = JSON.toJSONString(args);
//创建人信息
changeRecord.setChangeTime(DateUtils.getTime());
changeRecord.setCreateName(SecurityUtils.getLoginUser().getUser().getUserName());
Object object = null;
ContentParser contentParser;
try {
contentParser = (ContentParser) applicationContext.getBean(operateLog.parseclass());
object = contentParser.getResult(joinPoint, operateLog, operateLog.tableId());
} catch (Exception e) {
e.printStackTrace();
log.error("service加载失败:", e);
}
if ("add".equals(operateLog.type())) {
Map<String, Object> dataMap = (Map<String, Object>) objectToMap(object);
log.info("新增的数据:{}" + dataMap.toString());
}
if (operateLog.needDefaultCompare()) {
//比较新数据与数据库原数据
List<Map<String, Object>> list = defaultDealUpdate(object, oldMap, operateLog.tableId(),operateLog.codeName());
for (Map<String, Object> dataMap : list) {
changeRecord.setChangeField(String.valueOf(dataMap.get("filedName")));
changeRecord.setBeforeChange(String.valueOf(dataMap.get("oldValue")));
changeRecord.setAfterChange(String.valueOf(dataMap.get("newValue")));
changeRecord.setTypeId(String.valueOf(dataMap.get(operateLog.tableId())));
changeRecord.setCodeName(String.valueOf(dataMap.get(operateLog.codeName())));
changeRecordMapper.insertChangeRecord(changeRecord);
}
}
} catch (Exception e) {
log.info("自定义变更记录注解出现异常");
e.printStackTrace();
}
}
private List<Map<String, Object>> defaultDealUpdate(Object newObject, Map<String, Object> oldMap, String tableId, String codeName) {
try {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> newMap = (Map<String, Object>) objectToMap(newObject);
Object finalNewObject = newObject;
oldMap.forEach((k, v) -> {
Object newResult = newMap.get(k);
if (null != v && !v.equals(newResult)) {
Field field = ReflectionUtils.getAccessibleField(finalNewObject, k);
DataName dataName = field.getAnnotation(DataName.class);
if (null != dataName && StringUtils.isNotEmpty(dataName.name())) {
//翻译表达式 0=,1=
String readConverterExp = dataName.readConverterExp();
Map result = new HashMap();
result.put("filedName", dataName.name());
result.put(tableId, newMap.get(tableId));
result.put(codeName, newMap.get(codeName));
if (StringUtils.isNotEmpty(dataName.readConverterExp())) {
String oldValue = convertByExp(
String.valueOf(v), dataName.readConverterExp(), ",");
String newValue = convertByExp(
String.valueOf(newResult), dataName.readConverterExp(), ",");
result.put("oldValue", oldValue);
result.put("newValue", newValue);
} else {
result.put("oldValue", v);
result.put("newValue", newResult);
}
list.add(result);
}
}
});
log.info("比较的数据哈:{}" + list.toString());
return list;
} catch (Exception e) {
log.error("比较异常", e);
e.printStackTrace();
throw new RuntimeException("比较异常", e);
}
}
private Map<?, ?> objectToMap(Object obj) {
if (obj == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 如果使用JPA请自己打开这条配置
// mapper.addMixIn(Object.class, IgnoreHibernatePropertiesInJackson.class);
Map<?, ?> mappedObject = mapper.convertValue(obj, Map.class);
return mappedObject;
}
/**
* 翻译
*
* @param propertyValue 参数值如0
* @param converterExp 翻译注解的值如0=,1=,2=未知
* @param separator 分隔符
* @return 解析后值
*/
public static String convertByExp(String propertyValue, String converterExp, String separator) {
StringBuilder propertyString = new StringBuilder();
String[] convertSource = converterExp.split(",");
for (String item : convertSource) {
String[] itemArray = item.split("=");
if (StringUtils.containsAny(propertyValue, separator)) {
for (String value : propertyValue.split(separator)) {
if (itemArray[0].equals(value)) {
propertyString.append(itemArray[1] + separator);
break;
}
}
} else {
if (itemArray[0].equals(propertyValue)) {
return itemArray[1];
}
}
}
return StringUtils.stripEnd(propertyString.toString(), separator);
}
}

View File

@ -0,0 +1,34 @@
package com.ruoyi.framework.changeRecord;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ChangeRecordLog {
// 获取编辑信息的解析类目前为使用id获取
Class parseclass() default DefaultContentParse.class;
// 实现类
String serviceImplclass() default "";
// 实现类方法名
String serviceImplMethod() default "";
// 是否需要比较新旧数据
boolean needDefaultCompare() default true;
// id的类型
Class idType() default String.class;
// 操作对象的id字段名称
String tableId() default "id";
// 单号字段名称
String codeName() default "";
//操作类型
String type() default "update";
}

View File

@ -0,0 +1,17 @@
package com.ruoyi.framework.changeRecord;
import org.aspectj.lang.JoinPoint;
public interface ContentParser {
/**
* 获取信息返回查询出的对象
*
* @param joinPoint 查询条件的参数
* @param operateLog 注解
* @return 获得的结果
*/
public Object getResult(JoinPoint joinPoint, ChangeRecordLog operateLog, String tableId) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, Exception;
}

View File

@ -0,0 +1,15 @@
package com.ruoyi.framework.changeRecord;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface DataName {
String name() default ""; // 字段名称
/**
* 读取枚举内容转义表达式 (: 0=,1=,2=未知)
*/
String readConverterExp() default "";
}

View File

@ -0,0 +1,39 @@
package com.ruoyi.framework.changeRecord;
import org.aspectj.lang.JoinPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.lang.reflect.Method;
@Component
public class DefaultContentParse implements ContentParser {
@Autowired
private ApplicationContext applicationContext;
@Override
public Object getResult(JoinPoint joinPoint, ChangeRecordLog operateLog, String tableId) throws Exception {
Object info = joinPoint.getArgs()[0];
Object id = ReflectionUtils.getFieldValue(info, tableId);
Assert.notNull(id, "id不能为空");
String serviceImplName = operateLog.serviceImplclass();
String serviceImplMethod = operateLog.serviceImplMethod();
Class idType = operateLog.idType();
if (idType.isInstance(id)) {
//从ApplicationContext中取出已创建好的的对象
//不可直接反射创建serviceimpi对象因为反射创建出来的对象无法实例化dao接口
ApplicationContext applicationContext = SpringBootBeanUtil.getApplicationContext();
//反射创建serviceimpi实体对象和实体类
Class<?> ServiceImplType = Class.forName(serviceImplName);
Method method = ServiceImplType.getDeclaredMethod(serviceImplMethod,String.class);
// 使用反射调用方法
return method.invoke(applicationContext.getBean(ServiceImplType),id);
} else {
throw new RuntimeException("请核实id type");
}
}
}

View File

@ -0,0 +1,138 @@
package com.ruoyi.framework.changeRecord;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class ReflectionUtils {
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
* @param obj 读取的对象
* @param fieldName 读取的列
* @return 属性值
*/
public static Object getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
Object result = null;
try {
result = field.get(obj);
} catch (IllegalAccessException e) {
log.error("不可能抛出的异常{}", e.getMessage());
e.printStackTrace();
}
return result;
}
/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.如向上转型到Object仍无法找到, 返回null.
* @param obj 查找的对象
* @param fieldName 列名
* @return
*/
public static Field getAccessibleField(final Object obj, final String fieldName) {
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) {
try {
Field field = superClass.getDeclaredField(fieldName);
makeAccessible(field);
return field;
} catch (NoSuchFieldException e) { // NOSONAR
// Field不在当前类定义,继续向上转型
continue; // new add
}
}
return null;
}
/**
* 改变private/protected的成员变量为public尽量不调用实际改动的语句避免JDK的SecurityManager抱怨
* @param
*/
public static void makeAccessible(Field field) {
if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier
.isFinal(field.getModifiers())) && !field.isAccessible()) {
field.setAccessible(true);
}
}
/**
* 获取两个对象同名属性内容不相同的列表
* @param class1 old对象
* @param class2 new对象
* @return 区别列表
* @throws ClassNotFoundException 异常
* @throws IllegalAccessException 异常
*/
public static List<Map<String ,Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
List<Map<String,Object>> list=new ArrayList<Map<String, Object>>();
// 获取对象的class
Class<?> clazz1 = class1.getClass();
Class<?> clazz2 = class2.getClass();
// 获取对象的属性列表
Field[] field1 = clazz1.getDeclaredFields();
Field[] field2 = clazz2.getDeclaredFields();
StringBuilder sb=new StringBuilder();
// 遍历属性列表field1
for(int i=0;i<field1.length;i++) {
// 遍历属性列表field2
for (int j = 0; j < field2.length; j++) {
// 如果field1[i]属性名与field2[j]属性名内容相同
if (field1[i].getName().equals(field2[j].getName())) {
if (field1[i].getName().equals(field2[j].getName())) {
field1[i].setAccessible(true);
field2[j].setAccessible(true);
// 如果field1[i]属性值与field2[j]属性值内容不相同
if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
Map<String, Object> map2 = new HashMap<String, Object>();
DataName name=field1[i].getAnnotation(DataName.class);
String fieldName="";
if(name!=null){
fieldName=name.name();
} else {
fieldName=field1[i].getName();
}
map2.put("name", fieldName);
map2.put("old", field1[i].get(class1));
map2.put("new", field2[j].get(class2));
list.add(map2);
}
break;
}
}
}
}
return list;
}
/**
* 对比两个数据是否内容相同
* @param object1 比较对象1
* @param object2 比较对象2
* @return boolean类型
*/
public static boolean compareTwo(Object object1,Object object2){
if(object1==null&&object2==null){
return true;
}
if(object1==null&&object2!=null){
return false;
}
if(object1.equals(object2)){
return true;
}
return false;
}
}

View File

@ -0,0 +1,61 @@
package com.ruoyi.framework.changeRecord;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* SpringBoot 普通类获取Spring容器中的bean工具类
*/
@Component
public class SpringBootBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringBootBeanUtil.applicationContext == null) {
SpringBootBeanUtil.applicationContext = applicationContext;
}
System.out.println("========ApplicationContext配置成功========");
// System.out.println("========在普通类可以通过调用SpringBootBeanUtil.getApplicationContext()获取applicationContext对象========");
System.out.println("========applicationContext="+ SpringBootBeanUtil.applicationContext +"========");
}
/**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.bid.domain;
import com.ruoyi.common.annotation.DataName;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
@ -42,21 +43,26 @@ public class Bid extends BaseEntity
private String bidSalesmanDeptName;
/** 是否报名 */
@DataName(name = "是否报名")
private String bidHasRegistration;
/** 原报名编号 */
@Excel(name = "原报名编号")
@DataName(name = "原报名编号")
private String bidRegistrationNumber;
/** 开标日期 */
@Excel(name = "开标日期")
@DataName(name = "开标日期")
private String bidOpeningDate;
/** 是否网上报价0-是/1-否) */
@Excel(name = "是否网上报价",dictType = "bid_online_quotation")
@DataName(name = "是否网上报价",readConverterExp="0=是,1=否")
private String bidOnlineQuotation;
/** 报价平台网址 */
@DataName(name = "报价平台网址")
private String bidWebsite;
/** 招标单位编码 */
@ -64,140 +70,183 @@ public class Bid extends BaseEntity
/** 招标单位 */
@Excel(name = "招标单位")
@DataName(name = "招标单位")
private String bidTenderingUnit;
/** 招标代理 */
@Excel(name = "招标代理")
@DataName(name = "招标代理")
private String bidAgency;
/** 项目名称 */
@Excel(name = "项目名称")
@DataName(name = "项目名称")
private String bidProject;
/** 授权代表 */
@Excel(name = "授权代表")
@DataName(name = "授权代表")
private String bidAuthorizedRepresentative;
/** 授权人联系方式 */
@DataName(name = "联系方式")
private String bidAuthorizedPhone;
/** 招标文件付款方式 */
@DataName(name = "招标文件付款方式")
private String bidFilePaymentMethod;
/** 投标付款偏差 */
@DataName(name = "投标付款偏差")
private String bidPaymentDeviation;
/** 是否铜价联动0-是/1-否) */
@DataName(name = "是否铜价联动",readConverterExp="0=是,1=否")
private String bidCopperPriceLinkage;
/** 价格联动方式 */
@DataName(name = "价格联动方式")
private String bidPriceLinkageMethod;
/** 其他投标要求 */
@DataName(name = "其他投标要求")
private String bidOtherRequire;
/** 中标金额 */
@DataName(name = "中标金额")
private String bidWinningAmount;
/** 铜电缆金额 */
@DataName(name = "铜电缆金额")
private String bidCopperCableAmount;
/** 铝电缆金额 */
@DataName(name = "铝电缆金额")
private String bidAluminumCableAmount;
/** 开闭口1-开口价/2-闭口价) */
@DataName(name = "开闭口",readConverterExp="1=开口价,2=闭口价")
private String bidOpenClose;
/** 调价通知 */
@DataName(name = "调价通知")
private String bidPriceAdjustmentNotice;
/** 投标有效期 */
@DataName(name = "投标有效期")
private String bidValidityPeriod;
/** 铜价 */
@DataName(name = "铜价")
private String bidTongPrice;
/** 铝价 */
@DataName(name = "铝价")
private String bidLvPrice;
/** 点数 */
@DataName(name = "点数")
private String bidDs;
/** 厂价 */
@DataName(name = "厂价")
private String bidFactoryPrice;
/** 投标价 */
@DataName(name = "投标价")
private String bidPrice;
/** 业务费结算 */
@DataName(name = "业务费结算")
private String bidBusinessSettlement;
/** 保证金 */
@DataName(name = "保证金")
private String bidBond;
/** 中标服务费 */
@DataName(name = "中标服务费")
private String bidWinningServiceFee;
/** 履约保证金 */
@DataName(name = "履约保证金")
private String bidPerformanceBond;
/** 交货期(工期) */
@DataName(name = "交货期")
private String bidDeliveryDate;
/** 质保期 */
@DataName(name = "质保期")
private String bidWarrantyPeriod;
/** 是否竞价(0-是/1-否) */
@DataName(name = "是否竞价",readConverterExp="0=是,1=否")
private String bidBidding;
/** 评标办法 */
@DataName(name = "评标办法")
private String bidEvaluationMethod;
/** 技术要求 */
@DataName(name = "技术要求")
private String bidTechnicalRequire;
/** 价格联动 */
@DataName(name = "价格联动")
private String bidPriceLinkage;
/** 付款方式 */
@DataName(name = "付款方式")
private String bidPaymentMethod;
/** 其余事项 */
@DataName(name = "其余事项")
private String bidOtherMatters;
/** 制标人 */
@Excel(name = "制标人")
@DataName(name = "制标人")
private String bidZbr;
/** 校对人 */
@Excel(name = "校对人")
@DataName(name = "校对人")
private String bidJdr;
/** 审核人 */
@Excel(name = "审核人")
@DataName(name = "审核人")
private String bidShr;
/** 提交状态 */
@Excel(name = "提交状态",dictType = "bid_approval_status")
@DataName(name = "提交状态",readConverterExp="0=待提交,1=协助中,2=已完成,3=已驳回,4=审批中")
private String bidApprovalStatus;
/** 有无中标通知书0-是/1-否) */
@DataName(name = "有无中标通知书",readConverterExp="0=是,1=否")
private String bidNotificationAward;
/** 备注 */
@DataName(name = "备注")
private String bidRemark;
/** 驳回原因 */
@DataName(name = "反馈说明")
private String bidReturnRemark;
/** 创建人 */
private String createName;
/** 分派情况 0-已分派/1-未分派 */
@DataName(name = "分派情况",readConverterExp="0=已分派,1=未分派")
private String setReceiveUser;
/** 分派接收人 */
@DataName(name = "分派接收人账号")
private String receiveUserName;
@DataName(name = "分派接收人姓名")
private String receiveUserNickName;

View File

@ -1,30 +1,19 @@
package com.ruoyi.system.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
public class SysChangeRecord {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date changeTime;
private String changeTime;
private String createName;
private String changeField;
private String beforeChange;
private String afterChange;
private String typeId;
private String codeName;
private String remark;
public Date getChangeTime() {
public String getChangeTime() {
return changeTime;
}
public void setChangeTime(Date changeTime) {
public void setChangeTime(String changeTime) {
this.changeTime = changeTime;
}
@ -68,11 +57,7 @@ public class SysChangeRecord {
this.typeId = typeId;
}
public String getRemark() {
return remark;
}
public String getCodeName() { return codeName; }
public void setRemark(String remark) {
this.remark = remark;
}
public void setCodeName(String codeName) { this.codeName = codeName; }
}

View File

@ -1,7 +1,8 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.SysChangeRecord;
import java.util.List;
/**
* 变更日志记录Mapper
*/
@ -11,4 +12,10 @@ public interface SysChangeRecordMapper {
* @param changeRecord
*/
public void insertChangeRecord(SysChangeRecord changeRecord);
/**
* 获取变更记录
* @return
*/
List<SysChangeRecord> recordsList(SysChangeRecord sysChangeRecord);
}

View File

@ -0,0 +1,301 @@
package com.ruoyi.zgys.domain;
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;
/**
* 资格预审对象 zgys
*
* @author ruoyi
* @date 2024-07-22
*/
public class Zgys extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private String pqId;
/** 资格预审单编号 */
@Excel(name = "资格预审单编号")
private String pqCode;
/** 业务员账号 */
private String pqSalesmanCode;
/** 业务员编码 */
private String pqSalesmanBm;
/** 业务员 */
@Excel(name = "业务员")
private String pqSalesmanName;
/** 部门id */
private String pqSalesmanDeptId;
/** 部门名 */
@Excel(name = "部门名")
private String pqSalesmanDeptName;
/** 客户编码 */
private String pqCustomerBm;
/** 客户名称 */
@Excel(name = "客户名称")
private String pqCustomerName;
/** 项目 */
@Excel(name = "项目")
private String pqProject;
/** 中标备注 */
private String pqBidWinningRemark;
/** 授权人 */
@Excel(name = "授权人")
private String pqAuthorizedRepresentative;
/** 投标日期 */
@Excel(name = "投标日期")
private String pqBidDate;
/** 制标人 */
@Excel(name = "制标人")
private String pqZbr;
/** 中标状态 */
@Excel(name = "中标状态")
private String pqBidWinningStatus;
/** 说明 */
private String pqIllustrate;
/** 公告链接网址 */
private String pqAnnouncementLinkWebsite;
/** 联系电话 */
private String pqPhone;
/** 招标代理 */
private String pqAgency;
/** 备注 */
private String pqRemark;
/** 是否存档 */
@Excel(name = "是否存档")
private String pqArchiving;
/** 授权状态 */
@Excel(name = "授权状态")
private String pqEmpower;
/** 提交状态 */
@Excel(name = "提交状态")
private String pqApprovalStatus;
public void setPqId(String pqId)
{
this.pqId = pqId;
}
public String getPqId()
{
return pqId;
}
public void setPqCode(String pqCode)
{
this.pqCode = pqCode;
}
public String getPqCode()
{
return pqCode;
}
public void setPqSalesmanCode(String pqSalesmanCode)
{
this.pqSalesmanCode = pqSalesmanCode;
}
public String getPqSalesmanCode()
{
return pqSalesmanCode;
}
public void setPqSalesmanBm(String pqSalesmanBm)
{
this.pqSalesmanBm = pqSalesmanBm;
}
public String getPqSalesmanBm()
{
return pqSalesmanBm;
}
public void setPqSalesmanName(String pqSalesmanName)
{
this.pqSalesmanName = pqSalesmanName;
}
public String getPqSalesmanName()
{
return pqSalesmanName;
}
public void setPqSalesmanDeptId(String pqSalesmanDeptId)
{
this.pqSalesmanDeptId = pqSalesmanDeptId;
}
public String getPqSalesmanDeptId()
{
return pqSalesmanDeptId;
}
public void setPqSalesmanDeptName(String pqSalesmanDeptName)
{
this.pqSalesmanDeptName = pqSalesmanDeptName;
}
public String getPqSalesmanDeptName()
{
return pqSalesmanDeptName;
}
public void setPqCustomerBm(String pqCustomerBm)
{
this.pqCustomerBm = pqCustomerBm;
}
public String getPqCustomerBm()
{
return pqCustomerBm;
}
public void setPqCustomerName(String pqCustomerName)
{
this.pqCustomerName = pqCustomerName;
}
public String getPqCustomerName()
{
return pqCustomerName;
}
public void setPqProject(String pqProject)
{
this.pqProject = pqProject;
}
public String getPqProject()
{
return pqProject;
}
public void setPqBidWinningRemark(String pqBidWinningRemark)
{
this.pqBidWinningRemark = pqBidWinningRemark;
}
public String getPqBidWinningRemark()
{
return pqBidWinningRemark;
}
public void setPqAuthorizedRepresentative(String pqAuthorizedRepresentative)
{
this.pqAuthorizedRepresentative = pqAuthorizedRepresentative;
}
public String getPqAuthorizedRepresentative()
{
return pqAuthorizedRepresentative;
}
public void setPqBidDate(String pqBidDate)
{
this.pqBidDate = pqBidDate;
}
public String getPqBidDate()
{
return pqBidDate;
}
public void setPqZbr(String pqZbr)
{
this.pqZbr = pqZbr;
}
public String getPqZbr()
{
return pqZbr;
}
public void setPqBidWinningStatus(String pqBidWinningStatus)
{
this.pqBidWinningStatus = pqBidWinningStatus;
}
public String getPqBidWinningStatus()
{
return pqBidWinningStatus;
}
public void setPqIllustrate(String pqIllustrate)
{
this.pqIllustrate = pqIllustrate;
}
public String getPqIllustrate()
{
return pqIllustrate;
}
public void setPqAnnouncementLinkWebsite(String pqAnnouncementLinkWebsite)
{
this.pqAnnouncementLinkWebsite = pqAnnouncementLinkWebsite;
}
public String getPqAnnouncementLinkWebsite()
{
return pqAnnouncementLinkWebsite;
}
public void setPqPhone(String pqPhone)
{
this.pqPhone = pqPhone;
}
public String getPqPhone()
{
return pqPhone;
}
public void setPqAgency(String pqAgency)
{
this.pqAgency = pqAgency;
}
public String getPqAgency()
{
return pqAgency;
}
public void setPqRemark(String pqRemark)
{
this.pqRemark = pqRemark;
}
public String getPqRemark()
{
return pqRemark;
}
public void setPqArchiving(String pqArchiving)
{
this.pqArchiving = pqArchiving;
}
public String getPqArchiving()
{
return pqArchiving;
}
public void setPqEmpower(String pqEmpower)
{
this.pqEmpower = pqEmpower;
}
public String getPqEmpower()
{
return pqEmpower;
}
public String getPqApprovalStatus() { return pqApprovalStatus; }
public void setPqApprovalStatus(String pqApprovalStatus) { this.pqApprovalStatus = pqApprovalStatus; }
}

View File

@ -0,0 +1,68 @@
package com.ruoyi.zgys.mapper;
import java.util.List;
import com.ruoyi.zgys.domain.Zgys;
/**
* 资格预审Mapper接口
*
* @author ruoyi
* @date 2024-07-22
*/
public interface ZgysMapper
{
/**
* 查询资格预审
*
* @param pqId 资格预审主键
* @return 资格预审
*/
public Zgys selectZgysByPqId(String pqId);
/**
* 查询资格预审列表
*
* @param zgys 资格预审
* @return 资格预审集合
*/
public List<Zgys> selectZgysList(Zgys zgys);
/**
* 新增资格预审
*
* @param zgys 资格预审
* @return 结果
*/
public int insertZgys(Zgys zgys);
/**
* 修改资格预审
*
* @param zgys 资格预审
* @return 结果
*/
public int updateZgys(Zgys zgys);
/**
* 删除资格预审
*
* @param pqId 资格预审主键
* @return 结果
*/
public int deleteZgysByPqId(String pqId);
/**
* 批量删除资格预审
*
* @param pqIds 需要删除的数据主键集合
* @return 结果
*/
public int deleteZgysByPqIds(String[] pqIds);
/**
* 获取单据编号
* @param type
* @return
*/
String getCode(String type);
}

View File

@ -0,0 +1,68 @@
package com.ruoyi.zgys.service;
import java.util.List;
import com.ruoyi.zgys.domain.Zgys;
/**
* 资格预审Service接口
*
* @author ruoyi
* @date 2024-07-22
*/
public interface IZgysService
{
/**
* 查询资格预审
*
* @param pqId 资格预审主键
* @return 资格预审
*/
public Zgys selectZgysByPqId(String pqId);
/**
* 查询资格预审列表
*
* @param zgys 资格预审
* @return 资格预审集合
*/
public List<Zgys> selectZgysList(Zgys zgys);
/**
* 新增资格预审
*
* @param zgys 资格预审
* @return 结果
*/
public int insertZgys(Zgys zgys);
/**
* 修改资格预审
*
* @param zgys 资格预审
* @return 结果
*/
public int updateZgys(Zgys zgys);
/**
* 批量删除资格预审
*
* @param pqIds 需要删除的资格预审主键集合
* @return 结果
*/
public int deleteZgysByPqIds(String[] pqIds);
/**
* 删除资格预审信息
*
* @param pqId 资格预审主键
* @return 结果
*/
public int deleteZgysByPqId(String pqId);
/**
* 获取单据编号
* @param type
* @return
*/
String getCode(String type);
}

View File

@ -0,0 +1,110 @@
package com.ruoyi.zgys.service.impl;
import java.util.List;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.zgys.mapper.ZgysMapper;
import com.ruoyi.zgys.domain.Zgys;
import com.ruoyi.zgys.service.IZgysService;
/**
* 资格预审Service业务层处理
*
* @author ruoyi
* @date 2024-07-22
*/
@Service
public class ZgysServiceImpl implements IZgysService
{
@Autowired
private ZgysMapper zgysMapper;
/**
* 查询资格预审
*
* @param pqId 资格预审主键
* @return 资格预审
*/
@Override
public Zgys selectZgysByPqId(String pqId)
{
return zgysMapper.selectZgysByPqId(pqId);
}
/**
* 查询资格预审列表
*
* @param zgys 资格预审
* @return 资格预审
*/
@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<Zgys> selectZgysList(Zgys zgys)
{
return zgysMapper.selectZgysList(zgys);
}
/**
* 新增资格预审
*
* @param zgys 资格预审
* @return 结果
*/
@Override
public int insertZgys(Zgys zgys)
{
zgys.setCreateTime(DateUtils.getNowDate());
zgys.setUpdateTime(DateUtils.getNowDate());
return zgysMapper.insertZgys(zgys);
}
/**
* 修改资格预审
*
* @param zgys 资格预审
* @return 结果
*/
@Override
public int updateZgys(Zgys zgys)
{
zgys.setUpdateTime(DateUtils.getNowDate());
return zgysMapper.updateZgys(zgys);
}
/**
* 批量删除资格预审
*
* @param pqIds 需要删除的资格预审主键
* @return 结果
*/
@Override
public int deleteZgysByPqIds(String[] pqIds)
{
return zgysMapper.deleteZgysByPqIds(pqIds);
}
/**
* 删除资格预审信息
*
* @param pqId 资格预审主键
* @return 结果
*/
@Override
public int deleteZgysByPqId(String pqId)
{
return zgysMapper.deleteZgysByPqId(pqId);
}
/**
* 获取单据编号
* @param type
* @return
*/
@Override
public String getCode(String type) {
return zgysMapper.getCode(type);
}
}

View File

@ -12,7 +12,7 @@
<if test="beforeChange != null and beforeChange != ''">beforeChange,</if>
<if test="afterChange != null and afterChange != ''">afterChange,</if>
<if test="typeId != null and typeId != ''">typeId,</if>
<if test="remark != null and remark != ''">remark,</if>
<if test="codeName != null and codeName != ''">codeName,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="changeTime != null">#{changeTime},</if>
@ -21,7 +21,15 @@
<if test="beforeChange != null and beforeChange != ''">#{beforeChange},</if>
<if test="afterChange != null and afterChange != ''">#{afterChange},</if>
<if test="typeId != null and typeId != ''">#{typeId},</if>
<if test="remark != null and remark != ''">#{remark},</if>
<if test="codeName != null and codeName != ''">#{codeName},</if>
</trim>
</insert>
<select id="recordsList" resultType="SysChangeRecord" parameterType="SysChangeRecord">
select a.changeTime,b.nick_name createName,a.changeField,
a.beforeChange,a.afterChange,a.typeId,a.codeName
from sys_change_record a
left join sys_user b on a.createName = b.user_name
where a.typeId = #{typeId}
</select>
</mapper>

View File

@ -0,0 +1,183 @@
<?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.zgys.mapper.ZgysMapper">
<resultMap type="Zgys" id="ZgysResult">
<result property="pqId" column="pq_id" />
<result property="pqCode" column="pq_code" />
<result property="pqSalesmanCode" column="pq_salesman_code" />
<result property="pqSalesmanBm" column="pq_salesman_bm" />
<result property="pqSalesmanName" column="pq_salesman_name" />
<result property="pqSalesmanDeptId" column="pq_salesman_dept_id" />
<result property="pqSalesmanDeptName" column="pq_salesman_dept_name" />
<result property="pqCustomerBm" column="pq_customer_bm" />
<result property="pqCustomerName" column="pq_customer_name" />
<result property="pqProject" column="pq_project" />
<result property="pqBidWinningRemark" column="pq_bid_winning_remark" />
<result property="pqAuthorizedRepresentative" column="pq_authorized_representative" />
<result property="pqBidDate" column="pq_bid_date" />
<result property="pqZbr" column="pq_zbr" />
<result property="pqBidWinningStatus" column="pq_bid_winning_status" />
<result property="pqIllustrate" column="pq_illustrate" />
<result property="pqAnnouncementLinkWebsite" column="pq_announcement_link_website" />
<result property="pqPhone" column="pq_phone" />
<result property="pqAgency" column="pq_agency" />
<result property="pqRemark" column="pq_remark" />
<result property="pqApprovalStatus" column="pq_approval_status" />
<result property="pqArchiving" column="pq_archiving" />
<result property="pqEmpower" column="pq_empower" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="pqJoins">
left join sys_user u on u.user_name=a.create_by
left join sys_dept d on u.dept_id = d.dept_id
</sql>
<sql id="selectZgysVo">
select a.pq_id, a.pq_code, a.pq_salesman_code, a.pq_salesman_bm, a.pq_salesman_name,
a.pq_salesman_dept_id, a.pq_salesman_dept_name, a.pq_customer_bm,
a.pq_customer_name, a.pq_project, a.pq_bid_winning_remark, a.pq_authorized_representative,
a.pq_bid_date, a.pq_zbr, a.pq_bid_winning_status, a.pq_illustrate,
a.pq_announcement_link_website, a.pq_phone, a.pq_agency, a.pq_remark,
a.pq_approval_status,a.pq_archiving, a.pq_empower, a.create_by, a.create_time, a.update_by, a.update_time
from zgys a
<include refid="pqJoins"/>
</sql>
<select id="selectZgysList" parameterType="Zgys" resultMap="ZgysResult">
<include refid="selectZgysVo"/>
<where>
<if test="pqCode != null and pqCode != ''"> and pq_code like concat('%', #{pqCode}, '%')</if>
<if test="pqSalesmanName != null and pqSalesmanName != ''"> and pq_salesman_name like concat('%', #{pqSalesmanName}, '%')</if>
<if test="pqCustomerName != null and pqCustomerName != ''"> and pq_customer_name like concat('%', #{pqCustomerName}, '%')</if>
<if test="pqProject != null and pqProject != ''"> and pq_project like concat('%', #{pqProject}, '%')</if>
<if test="pqApprovalStatus != null and pqApprovalStatus != ''"> and pq_approval_status = #{pqApprovalStatus}</if>
<if test="pqArchiving != null and pqArchiving != ''"> and pq_archiving = #{pqArchiving}</if>
<if test="pqEmpower != null and pqEmpower != ''"> and pq_empower = #{pqEmpower}</if>
<!-- 数据范围过滤 -->
${params.dataScope}
</where>
</select>
<select id="selectZgysByPqId" parameterType="String" resultMap="ZgysResult">
<include refid="selectZgysVo"/>
where pq_id = #{pqId}
</select>
<insert id="insertZgys" parameterType="Zgys">
insert into zgys
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="pqId != null">pq_id,</if>
<if test="pqCode != null and pqCode != ''">pq_code,</if>
<if test="pqSalesmanCode != null">pq_salesman_code,</if>
<if test="pqSalesmanBm != null">pq_salesman_bm,</if>
<if test="pqSalesmanName != null and pqSalesmanName != ''">pq_salesman_name,</if>
<if test="pqSalesmanDeptId != null">pq_salesman_dept_id,</if>
<if test="pqSalesmanDeptName != null and pqSalesmanDeptName != ''">pq_salesman_dept_name,</if>
<if test="pqCustomerBm != null">pq_customer_bm,</if>
<if test="pqCustomerName != null and pqCustomerName != ''">pq_customer_name,</if>
<if test="pqProject != null and pqProject != ''">pq_project,</if>
<if test="pqBidWinningRemark != null">pq_bid_winning_remark,</if>
<if test="pqAuthorizedRepresentative != null and pqAuthorizedRepresentative != ''">pq_authorized_representative,</if>
<if test="pqBidDate != null and pqBidDate != ''">pq_bid_date,</if>
<if test="pqZbr != null">pq_zbr,</if>
<if test="pqBidWinningStatus != null">pq_bid_winning_status,</if>
<if test="pqIllustrate != null and pqIllustrate != ''">pq_illustrate,</if>
<if test="pqAnnouncementLinkWebsite != null">pq_announcement_link_website,</if>
<if test="pqPhone != null and pqPhone != ''">pq_phone,</if>
<if test="pqAgency != null">pq_agency,</if>
<if test="pqRemark != null">pq_remark,</if>
<if test="pqApprovalStatus != null">pq_approval_status,</if>
<if test="pqArchiving != null">pq_archiving,</if>
<if test="pqEmpower != null">pq_empower,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="pqId != null">#{pqId},</if>
<if test="pqCode != null and pqCode != ''">#{pqCode},</if>
<if test="pqSalesmanCode != null">#{pqSalesmanCode},</if>
<if test="pqSalesmanBm != null">#{pqSalesmanBm},</if>
<if test="pqSalesmanName != null and pqSalesmanName != ''">#{pqSalesmanName},</if>
<if test="pqSalesmanDeptId != null">#{pqSalesmanDeptId},</if>
<if test="pqSalesmanDeptName != null and pqSalesmanDeptName != ''">#{pqSalesmanDeptName},</if>
<if test="pqCustomerBm != null">#{pqCustomerBm},</if>
<if test="pqCustomerName != null and pqCustomerName != ''">#{pqCustomerName},</if>
<if test="pqProject != null and pqProject != ''">#{pqProject},</if>
<if test="pqBidWinningRemark != null">#{pqBidWinningRemark},</if>
<if test="pqAuthorizedRepresentative != null and pqAuthorizedRepresentative != ''">#{pqAuthorizedRepresentative},</if>
<if test="pqBidDate != null and pqBidDate != ''">#{pqBidDate},</if>
<if test="pqZbr != null">#{pqZbr},</if>
<if test="pqBidWinningStatus != null">#{pqBidWinningStatus},</if>
<if test="pqIllustrate != null and pqIllustrate != ''">#{pqIllustrate},</if>
<if test="pqAnnouncementLinkWebsite != null">#{pqAnnouncementLinkWebsite},</if>
<if test="pqPhone != null and pqPhone != ''">#{pqPhone},</if>
<if test="pqAgency != null">#{pqAgency},</if>
<if test="pqRemark != null">#{pqRemark},</if>
<if test="pqApprovalStatus != null">#{pqApprovalStatus},</if>
<if test="pqArchiving != null">#{pqArchiving},</if>
<if test="pqEmpower != null">#{pqEmpower},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
</trim>
</insert>
<update id="updateZgys" parameterType="Zgys">
update zgys
<trim prefix="SET" suffixOverrides=",">
<if test="pqCode != null and pqCode != ''">pq_code = #{pqCode},</if>
<if test="pqSalesmanCode != null">pq_salesman_code = #{pqSalesmanCode},</if>
<if test="pqSalesmanBm != null">pq_salesman_bm = #{pqSalesmanBm},</if>
<if test="pqSalesmanName != null and pqSalesmanName != ''">pq_salesman_name = #{pqSalesmanName},</if>
<if test="pqSalesmanDeptId != null">pq_salesman_dept_id = #{pqSalesmanDeptId},</if>
<if test="pqSalesmanDeptName != null and pqSalesmanDeptName != ''">pq_salesman_dept_name = #{pqSalesmanDeptName},</if>
<if test="pqCustomerBm != null">pq_customer_bm = #{pqCustomerBm},</if>
<if test="pqCustomerName != null and pqCustomerName != ''">pq_customer_name = #{pqCustomerName},</if>
<if test="pqProject != null and pqProject != ''">pq_project = #{pqProject},</if>
<if test="pqBidWinningRemark != null">pq_bid_winning_remark = #{pqBidWinningRemark},</if>
<if test="pqAuthorizedRepresentative != null and pqAuthorizedRepresentative != ''">pq_authorized_representative = #{pqAuthorizedRepresentative},</if>
<if test="pqBidDate != null and pqBidDate != ''">pq_bid_date = #{pqBidDate},</if>
<if test="pqZbr != null">pq_zbr = #{pqZbr},</if>
<if test="pqBidWinningStatus != null">pq_bid_winning_status = #{pqBidWinningStatus},</if>
<if test="pqIllustrate != null and pqIllustrate != ''">pq_illustrate = #{pqIllustrate},</if>
<if test="pqAnnouncementLinkWebsite != null">pq_announcement_link_website = #{pqAnnouncementLinkWebsite},</if>
<if test="pqPhone != null and pqPhone != ''">pq_phone = #{pqPhone},</if>
<if test="pqAgency != null">pq_agency = #{pqAgency},</if>
<if test="pqRemark != null">pq_remark = #{pqRemark},</if>
<if test="pqApprovalStatus != null">pq_approval_status = #{pqApprovalStatus},</if>
<if test="pqArchiving != null">pq_archiving = #{pqArchiving},</if>
<if test="pqEmpower != null">pq_empower = #{pqEmpower},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where pq_id = #{pqId}
</update>
<delete id="deleteZgysByPqId" parameterType="String">
delete from zgys where pq_id = #{pqId}
</delete>
<delete id="deleteZgysByPqIds" parameterType="String">
delete from zgys where pq_id in
<foreach item="pqId" collection="array" open="(" separator="," close=")">
#{pqId}
</foreach>
</delete>
<select id="getCode" resultType="String" statementType="CALLABLE">
{call GetSerialNo(#{type,mode=IN,jdbcType=VARCHAR})}
</select>
</mapper>

View File

@ -0,0 +1,11 @@
import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi";
// 获取变更记录
export function recordsList(query) {
return request({
url: '/system/changeRecord/recordsList',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,44 @@
import request from '@/utils/request'
// 查询资格预审列表
export function listZgys(query) {
return request({
url: '/zgys/zgys/list',
method: 'get',
params: query
})
}
// 查询资格预审详细
export function getZgys(pqId) {
return request({
url: '/zgys/zgys/' + pqId,
method: 'get'
})
}
// 新增资格预审
export function addZgys(data) {
return request({
url: '/zgys/zgys',
method: 'post',
data: data
})
}
// 修改资格预审
export function updateZgys(data) {
return request({
url: '/zgys/zgys',
method: 'put',
data: data
})
}
// 删除资格预审
export function delZgys(pqId) {
return request({
url: '/zgys/zgys/' + pqId,
method: 'delete'
})
}

View File

@ -124,6 +124,17 @@
v-hasPermi="['bid:bid:assign']"
>分派</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-user-solid"
size="mini"
:disabled="single"
@click="handleChangeRecord"
v-hasPermi="['bid:bid:add']"
>变更记录</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<div v-tableHeight="{customHeight: 76}">
@ -223,7 +234,7 @@
<el-input v-model="form.bidCode" placeholder="系统自动生成" :disabled="true"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="6">
<el-form-item label="是否报名" prop="bidHasRegistration">
<el-select v-model="form.bidHasRegistration" :disabled="this.form.bidApprovalStatus != '0' && this.form.bidApprovalStatus != null">
<el-option
@ -235,9 +246,11 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="10">
<el-form-item label="原报名编号" prop="bidRegistrationNumber">
<el-input v-model="form.bidRegistrationNumber" placeholder="请输入原报名编号" :disabled="(this.form.bidApprovalStatus != '0' && this.form.bidApprovalStatus != null) || this.form.bidHasRegistration!='0'"/>
<el-input v-model="form.bidRegistrationNumber" :disabled="true">
<el-button slot="append" icon="el-icon-search" @click="openZgys" v-if="this.form.bidApprovalStatus == '0' || this.form.bidApprovalStatus == null"/>
</el-input>
</el-form-item>
</el-col>
</el-row>
@ -289,7 +302,7 @@
<el-form-item label="招标单位" prop="bidTenderingUnit">
<el-input v-model="form.bidTenderingUnitBm" v-if="false"/>
<el-input v-model="form.bidTenderingUnit" placeholder="请输入招标单位" :disabled="true">
<el-button slot="append" icon="el-icon-search" @click="openCustomer" v-if="this.form.bidApprovalStatus == '0' || this.form.bidApprovalStatus == null"></el-button>
<el-button slot="append" icon="el-icon-search" @click="openCustomer" v-if="this.form.bidApprovalStatus == '0' || this.form.bidApprovalStatus == null"></el-button>
</el-input>
</el-form-item>
</el-col>
@ -846,6 +859,49 @@
</el-table-column>
</el-table>
</el-dialog>
<!-- 资格预审单列表对话框-->
<el-dialog :title="zgysTitle" :visible.sync="zgysOpen" width="1000px" append-to-body>
<el-form :model="zgysQueryParams" ref="queryQccForm" size="small" :inline="true" label-width="100px" @submit.native.prevent>
<el-form-item label="招标单位" prop="Name">
<el-input
v-model="zgysQueryParams.pqCustomerName"
placeholder="请输入招标单位"
@keyup.enter.native="getZgysList"
clearable
/>
</el-form-item>
<el-form-item label="项目" prop="pqProject">
<el-input
v-model="zgysQueryParams.pqProject"
placeholder="请输入项目"
@keyup.enter.native="getZgysList"
clearable
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="getZgysList">搜索</el-button>
</el-form-item>
</el-form>
<el-table class="down" v-loading="zgysLoading" ref="zgysTable" :data="zgysList" @selection-change="handleSelectionZgysChange" border stripe style="width: 100%;margin-top: 10px;" height="380px">
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="pqCode" label="资格预审单编号" width="200px"></el-table-column>
<el-table-column prop="pqCustomerName" label="招标单位"/>
<el-table-column prop="pqProject" label="项目名称"></el-table-column>
<el-table-column prop="pqAuthorizedRepresentative" label="授权代表" width="150px"></el-table-column>
</el-table>
<pagination
v-show="zgysTotal>0"
:total="zgysTotal"
:page.sync="zgysQueryParams.pageNum"
:limit.sync="zgysQueryParams.pageSize"
@pagination="getZgysList"
/>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="zgysConfirm" :disabled="zgysSingle"> </el-button>
<el-button @click="zgysCancel"> </el-button>
</div>
</el-dialog>
</el-form>
<div slot="footer" class="dialog-footer">
<div style="height: 25px;">
@ -870,6 +926,10 @@
<CustomerSelect ref="customerSelect" :open="customerOpen" @submit="submitCustomer" @cancel="customerOpen=false"></CustomerSelect>
</el-dialog>
<PeopleSelect v-if="checkRole(['BID'])" ref="peopleSelect" :type="'single'" :isCheck="true" :open="peopleOpenFp" @cancel="peopleOpenFp=false" @submit="submitPeopleFp"></PeopleSelect>
<el-dialog :title="changeRecordTitle" :visible.sync="openChangeRecord" v-if="openChangeRecord" width="1200px" append-to-body>
<ChangeRecord :codeProp="codeProp"></ChangeRecord>
</el-dialog>
</div>
</template>
<style>
@ -899,6 +959,7 @@
<script>
import { checkPermi,checkRole } from '@/utils/permission';//
import { getToken } from "@/utils/auth";
import { listZgys} from "@/api/zgys/zgys";
import { versionList,getTongLvPrice,bidAssign,listBid, getBid, delBid, addBid, updateBid, bidFileList,bidFileDelete, commitTbxx,commitJsBid, rejectBid } from "@/api/bid/bid";
/** 弹窗放大、拖拽 */
import elDragDialog from "@/directive/dialog/dragDialog";
@ -909,6 +970,9 @@ import CustomerSelect from "@/views/components/Tools/CustomerSelect/index.vue";
/** 导入选人组件 */
import PeopleSelect from "@/views/components/Tools/PeopleSelect/index.vue";
/** 导入变更记录组件 */
import ChangeRecord from "@/views/components/Tools/ChangeRecord/index.vue";
export default {
name: "Bid",
directives: {
@ -918,7 +982,8 @@ export default {
//
'jsqrDialog': jsqrDialog,
'CustomerSelect': CustomerSelect,
'PeopleSelect': PeopleSelect
'PeopleSelect': PeopleSelect,
'ChangeRecord':ChangeRecord
},
dicts: ['bid_set_receive_user','bid_has_registration','bid_approval_status','bid_online_quotation','bid_copper_price_linkage','bid_open_close','bid_bidding','bid_notification_award','bid_jsxz_group','bid_jsxz_approval_status'],
data() {
@ -1027,8 +1092,26 @@ export default {
peopleOpenSelectYwy:false, //
selectedPeoples:[],
//
changeRecordTitle: "",
openChangeRecord:false,
codeProp: "",
//
versionList: [], //
//
zgysTitle: "",
zgysOpen: false,
zgysLoading: false,
zgysTotal: 0,
zgysList: [],
zgysQueryParams: {
pageNum: 1,
pageSize: 10,
},
zgysSingle: true,
zgysMultiple: true,
};
},
created() {
@ -1303,6 +1386,14 @@ export default {
this.openPeopleSelect();
},
/** 打开变更记录 */
handleChangeRecord(){
const bidIds = this.ids;
this.openChangeRecord=true;
this.changeRecordTitle="变更记录";
this.codeProp = bidIds[0];
},
/** 是否报名事件 */
bidHasRegistrationChange(val) {
this.form.bidRegistrationNumber = (val != '0'?'':this.form.bidRegistrationNumber)
@ -1510,6 +1601,49 @@ export default {
});
},
/*********************************技术协助模块*****************************************/
/*********************************打开资格预审列表选择*****************************************/
openZgys(){
this.zgysOpen=true;
this.zgysTitle="选择资格预审单";
this.resetZgysQuery();
},
getZgysList(){
this.zgysLoading = true;
listZgys(this.zgysQueryParams).then(response => {
this.zgysList = response.rows;
this.zgysTotal = response.total;
this.zgysLoading = false;
});
},
handleSelectionZgysChange(selection) {
this.zgysSingle = selection.length!==1
this.zgysMultiple = !selection.length
},
zgysConfirm() {
const zgysTable = this.$refs.zgysTable;
const selectedData = zgysTable.selection;
this.form.bidRegistrationNumber = selectedData[0].pqCode;
this.form.bidTenderingUnit = selectedData[0].pqCustomerName;
this.form.bidProject = selectedData[0].pqProject;
this.form.bidAuthorizedRepresentative = selectedData[0].pqAuthorizedRepresentative;
this.zgysOpen = false;
},
//
zgysCancel() {
this.zgysOpen = false;
this.resetZgysQuery();
},
/** 重置按钮操作 */
resetZgysQuery() {
this.zgysList = [];
this.zgysQueryParams = {
pqCustomerName: "",
pqProject: "",
pqApprovalStatus: '2'
}
},
/*********************************打开资格预审列表选择*****************************************/
}
};
</script>

View File

@ -0,0 +1,93 @@
<template>
<el-table height="500" v-loading="loading" :data="records" :span-method="objectSpanMethod">
<el-table-column label="变更日期" align="center" prop="changeTime"/>
<el-table-column label="变更字段" align="center" prop="changeField"/>
<el-table-column label="变更前" align="center" prop="beforeChange"/>
<el-table-column label="变更后" align="center" prop="afterChange"/>
<el-table-column label="变更人" align="center" prop="createName"/>
</el-table>
</template>
<script>
import { recordsList } from "@/api/system/changeRecord";
export default {
name: "ChangeRecord",
props: {
codeProp: String
},
data() {
return {
loading:false,
//
records: [],
mergeObj: {}, //
mergeArr: ['changeTime', 'createName'] //
}
},
watch: {
codeProp(value,oldvalue){
this.getList();
}
},
created() {
this.getList();
},
methods: {
getList(){
this.records = [];
const code = this._props.codeProp;
if(code){
this.loading = false;
const params = {'typeId': this._props.codeProp};
recordsList(params).then(response => {
this.records = response
this.getSpanArr(this.records);
this.loading = false;
});
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
//
if(this.mergeArr.indexOf(column.property) !== -1) {
// 0
if(this.mergeObj[column.property][rowIndex]) {
return [this.mergeObj[column.property][rowIndex], 1]
} else {
// 0
return [0, 0];
}
}
},
// getSpanArr
getSpanArr(data) {
this.mergeArr.forEach((key, index1) => {
let count = 0; //
this.mergeObj[key] = []; //
data.forEach((item, index) => {
// index == 0 push 1
if(index === 0) {
this.mergeObj[key].push(1);
} else {
// count +1 push 0
if(item[key] === data[index - 1][key]) {
this.mergeObj[key][count] += 1;
this.mergeObj[key].push(0);
} else {
//
count = index; //
this.mergeObj[key].push(1); // push 1
}
}
})
})
}
}
}
</script>
<style scoped>
</style>

View File

@ -249,7 +249,7 @@
<!-- 添加或修改报价对话框 -->
<el-dialog :visible.sync="open" width="1050px" v-el-drag-dialog append-to-body>
<template slot="title">
报价单信息<span style="color:red;margin-left:25px">(此报价单数据型号规格电压等如需下单或签订合同引用请再次自行核对责任自负)</span>
<div>询价单信息</div><div style="color:red;">(1如厂价金额低于10万,不得特批; 2此报价单数据型号规格电压等如需下单或签订合同引用请再次自行核对责任自负)</div>
</template>
<el-form ref="form" :model="form" :rules="rules" label-width="120px">
<el-divider content-position="left" class="customer_divider_text">当前协助情况</el-divider>

View File

@ -610,7 +610,7 @@
const per2 = this.form.perc2;
const count = '1';
const setPrice = toDecimal(price * (per?per:1) * (per2?per2:1));
const allPrice = toDecimal(count * price * (per?per:1) * (per2?per2:1));
const allPrice = toDecimal(count * setPrice);
const rowDate = {
uid_0: uid_0.toString(),
@ -724,7 +724,7 @@
per: this.form.perc,
per2: this.form.perc2,
setPrice: toDecimal(row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1)),
allPrice: toDecimal(row.count * row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1)),
allPrice: toDecimal(row.count * toDecimal(row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1))),
});
})
},
@ -736,7 +736,7 @@
this.$set(this.selectedResultData, index, {
...row,
setPrice: toDecimal(row.price * (row.per?row.per:1) * (row.per2?row.per2:1)),
allPrice: toDecimal(row.count * row.price * (row.per?row.per:1) * (row.per2?row.per2:1)),
allPrice: toDecimal(row.count * toDecimal(row.price * (row.per?row.per:1) * (row.per2?row.per2:1))),
});
})
},
@ -908,7 +908,7 @@
) {
this.selectedResultData[i].price = response.data[j].price;
const setPrice = toDecimal(this.selectedResultData[i].price * (this.selectedResultData[i].per?this.selectedResultData[i].per:1) * (this.selectedResultData[i].per2?this.selectedResultData[i].per2:1));
const allPrice = toDecimal(this.selectedResultData[i].count * this.selectedResultData[i].price * (this.selectedResultData[i].per?this.selectedResultData[i].per:1) * (this.selectedResultData[i].per2?this.selectedResultData[i].per2:1));
const allPrice = toDecimal(this.selectedResultData[i].count * setPrice);
this.selectedResultData[i].setPrice = setPrice;
this.selectedResultData[i].allPrice = allPrice;

View File

@ -352,7 +352,7 @@
per: this.form.perc,
per2: this.form.perc2,
setPrice: toDecimal(row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1)),
allPrice: toDecimal(row.count * row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1)),
allPrice: toDecimal(row.count * toDecimal(row.price * (this.form.perc?this.form.perc:1) * (this.form.perc2?this.form.perc2:1))),
});
})
},
@ -364,7 +364,7 @@
this.$set(this.selectedResultData, index, {
...row,
setPrice: toDecimal(row.price * (row.per?row.per:1) * (row.per2?row.per2:1)),
allPrice: toDecimal(row.count * row.price * (row.per?row.per:1) * (row.per2?row.per2:1)),
allPrice: toDecimal(row.count * toDecimal(row.price * (row.per?row.per:1) * (row.per2?row.per2:1))),
});
})
},
@ -391,7 +391,7 @@
) {
this.selectedResultData[i].price = response.data[j].price;
const setPrice = toDecimal(this.selectedResultData[i].price * (this.selectedResultData[i].per?this.selectedResultData[i].per:1) * (this.selectedResultData[i].per2?this.selectedResultData[i].per2:1));
const allPrice = toDecimal(this.selectedResultData[i].count * this.selectedResultData[i].price * (this.selectedResultData[i].per?this.selectedResultData[i].per:1) * (this.selectedResultData[i].per2?this.selectedResultData[i].per2:1));
const allPrice = toDecimal(this.selectedResultData[i].count * setPrice);
this.selectedResultData[i].setPrice = setPrice;
this.selectedResultData[i].allPrice = allPrice;

View File

@ -0,0 +1,551 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="150px">
<el-form-item label="资格预审单编号" prop="pqCode">
<el-input
v-model="queryParams.pqCode"
placeholder="请输入资格预审单编号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="业务员" prop="pqSalesmanName">
<el-input
v-model="queryParams.pqSalesmanName"
placeholder="请输入业务员"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="客户名称" prop="pqCustomerName">
<el-input
v-model="queryParams.pqCustomerName"
placeholder="请输入客户名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="项目" prop="pqProject">
<el-input
v-model="queryParams.pqProject"
placeholder="请输入项目"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="提交状态" prop="pqAapprovalStatus">
<el-select v-model="queryParams.pqAapprovalStatus" placeholder="请选择提交状态" clearable>
<el-option
v-for="dict in dict.type.pq_approval_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否存档" prop="pqArchiving">
<el-select v-model="queryParams.pqArchiving" placeholder="请选择是否存档" clearable>
<el-option
v-for="dict in dict.type.pq_archiving"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="授权状态" prop="pqEmpower">
<el-select v-model="queryParams.pqEmpower" placeholder="请选择授权状态" clearable>
<el-option
v-for="dict in dict.type.pq_empower"
: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="['zgys:zgys: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="['zgys:zgys: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="['zgys:zgys: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="['zgys:zgys:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<div v-tableHeight="{customHeight: 76}">
<el-table height="100%" v-loading="loading" :data="zgysList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="资格预审单id" align="center" prop="pqId" v-if="false" />
<el-table-column fixed label="资格预审单编号" align="center" prop="pqCode" width="200px">
<template slot-scope="scope">
<el-link :underline="false" type="primary" @click="handleUpdate(scope.row)">{{scope.row.pqCode}}</el-link>
</template>
</el-table-column>
<el-table-column fixed label="提交状态" align="center" prop="pqApprovalStatus">
<template slot-scope="scope">
<dict-tag :options="dict.type.pq_approval_status" :value="scope.row.pqApprovalStatus"/>
</template>
</el-table-column>
<el-table-column label="业务员" align="center" prop="pqSalesmanName" width="150px"/>
<el-table-column label="客户名称" align="center" prop="pqCustomerName" width="250px"/>
<el-table-column label="项目" align="center" prop="pqProject" width="250px"/>
<el-table-column label="授权人" align="center" prop="pqAuthorizedRepresentative" width="100px"/>
<el-table-column label="开标日期" align="center" prop="pqBidDate" width="100px"/>
<el-table-column label="制标人" align="center" prop="pqZbr" width="150px"/>
<el-table-column label="是否存档" align="center" prop="pqArchiving">
<template slot-scope="scope">
<dict-tag :options="dict.type.pq_archiving" :value="scope.row.pqArchiving"/>
</template>
</el-table-column>
<el-table-column label="授权状态" align="center" prop="pqEmpower">
<template slot-scope="scope">
<dict-tag :options="dict.type.pq_empower" :value="scope.row.pqEmpower"/>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createName" width="150px"/>
<el-table-column label="创建时间" align="center" prop="createTime" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
</el-table>
</div>
<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="1150px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="150px">
<el-divider content-position="left" class="customer_divider_text">当前协助情况</el-divider>
<el-row>
<el-col :span="4">
<el-form-item label="提交状态" prop="pqApprovalStatus">
<dict-tag :options="dict.type.pq_approval_status" :value="this.form.pqApprovalStatus"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="授权状态" prop="pqEmpower">
<dict-tag :options="dict.type.pq_empower" :value="this.form.pqEmpower"/>
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left" class="customer_divider_text">基本信息</el-divider>
<el-row :gutter="8">
<el-col :span="8">
<el-form-item label="资格预审单编号" prop="pqCode">
<el-input v-model="form.pqCode" placeholder="系统自动生成" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所属部门" prop="pqSalesmanDeptName">
<el-input v-model="form.pqSalesmanDeptId" v-if="false"/>
<el-input v-model="form.pqSalesmanDeptName" :disabled="true"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="业务员" prop="pqSalesmanName">
<el-input v-model="form.pqSalesmanCode" v-if="false"/>
<el-input v-model="form.pqSalesmanBm" v-if="false"/>
<el-input v-model="form.pqSalesmanName" :disabled="true"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="16">
<el-form-item label="客户名称" prop="pqCustomerName">
<el-input v-model="form.pqCustomerBm" v-if="false"/>
<el-input v-model="form.pqCustomerName" :disabled="true">
<el-button slot="append" icon="el-icon-search" @click="openCustomer"/>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="授权人" prop="pqAuthorizedRepresentative">
<el-input v-model="form.pqAuthorizedRepresentative" placeholder="请输入授权人" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="24">
<el-form-item label="项目" prop="pqProject">
<el-input type="textarea" autosize v-model="form.pqProject" placeholder="请输入项目" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="24">
<el-form-item label="中标备注" prop="pqBidWinningRemark">
<el-input type="textarea" autosize v-model="form.pqBidWinningRemark" placeholder="请输入中标备注" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="8">
<el-form-item label="开标日期" prop="pqBidDate">
<el-date-picker clearable
v-model="form.pqBidDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择开标日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="制标人" prop="pqZbr">
<el-input v-model="form.pqZbr" placeholder="请输入制标人" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="中标状态" prop="pqBidWinningStatus">
<el-select v-model="form.pqBidWinningStatus" placeholder="请选择中标状态">
<el-option
v-for="dict in dict.type.pq_bid_winning_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="8">
<el-form-item label="说明" prop="pqIllustrate">
<el-select v-model="form.pqIllustrate" placeholder="请选择说明">
<el-option
v-for="dict in dict.type.pq_illustrate"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话" prop="pqPhone">
<el-input v-model="form.pqPhone" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="公告链接网址" prop="pqAnnouncementLinkWebsite">
<el-input v-model="form.pqAnnouncementLinkWebsite" placeholder="请输入公告链接网址" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="8">
<el-form-item label="招标代理" prop="pqAgency">
<el-input v-model="form.pqAgency" placeholder="请输入招标代理" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否存档" prop="pqArchiving">
<el-select v-model="form.pqArchiving" placeholder="请选择是否存档">
<el-option
v-for="dict in dict.type.pq_archiving"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="8">
<el-col :span="24">
<el-form-item label="备注" prop="pqRemark">
<el-input type="textarea" autosize v-model="form.pqRemark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
<!-- 客户选择对话框-->
<CustomerSelect ref="customerSelect" :open="customerOpen" @submit="submitCustomer" @cancel="customerOpen=false"></CustomerSelect>
</el-dialog>
</div>
</template>
<style>
/** 弹窗设置 */
.el-dialog__body {
padding: 10px 10px;
color: #606266;
font-size: 14px;
word-break: break-all;
overflow-y: auto; /** 自动显示垂直滚动条 */
max-height: 580px; /** 设置最大高度,根据需要调整 */
}
/** divider 文本样式 */
.customer_divider_text .el-divider__text{
color: #1890ff;
font-size: 18px;
font-weight: 600;
}
</style>
<script>
import { listZgys, getZgys, delZgys, addZgys, updateZgys } from "@/api/zgys/zgys";
/** 导入客户选择组件 */
import CustomerSelect from "@/views/components/Tools/CustomerSelect/index.vue";
export default {
name: "Zgys",
dicts: ['pq_approval_status','pq_archiving', 'pq_bid_winning_status', 'pq_empower', 'pq_illustrate'],
components: {
//
'CustomerSelect': CustomerSelect,
},
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
zgysList: [],
//
title: "",
//
open: false,
//
customerOpen:false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
pqCode: null,
pqSalesmanName: null,
pqCustomerName: null,
pqProject: null,
pqBidWinningStatus: null,
pqArchiving: null,
pqEmpower: null,
},
//
form: {},
//
rules: {
pqSalesmanName: [
{ required: true, message: "业务员不能为空", trigger: "blur" }
],
pqSalesmanDeptName: [
{ required: true, message: "部门名不能为空", trigger: "blur" }
],
pqCustomerName: [
{ required: true, message: "客户名称不能为空", trigger: "blur" }
],
pqProject: [
{ required: true, message: "项目不能为空", trigger: "blur" }
],
pqAuthorizedRepresentative: [
{ required: true, message: "授权人不能为空", trigger: "blur" }
],
pqBidDate: [
{ required: true, message: "开标日期不能为空", trigger: "blur" }
],
pqIllustrate: [
{ required: true, message: "说明不能为空", trigger: "change" }
],
pqPhone: [
{ required: true, message: "联系电话不能为空", trigger: "blur" }
],
}
};
},
created() {
this.getList();
},
methods: {
/** 查询资格预审列表 */
getList() {
this.loading = true;
listZgys(this.queryParams).then(response => {
this.zgysList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
pqId: null,
pqCode: null,
pqSalesmanCode: null,
pqSalesmanBm: null,
pqSalesmanName: null,
pqSalesmanDeptId: null,
pqSalesmanDeptName: null,
pqCustomerBm: null,
pqCustomerName: null,
pqProject: null,
pqBidWinningRemark: null,
pqAuthorizedRepresentative: null,
pqBidDate: null,
pqZbr: null,
pqBidWinningStatus: null,
pqIllustrate: null,
pqAnnouncementLinkWebsite: null,
pqPhone: null,
pqAgency: null,
pqRemark: null,
pqArchiving: null,
pqEmpower: null,
pqApprovalStatus: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: 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.pqId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加资格预审";
this.form.pqSalesmanName = this.$store.state.user.nickName;
this.form.pqSalesmanBm = this.$store.state.user.sapBm;
this.form.pqSalesmanCode = this.$store.state.user.name;
this.form.pqSalesmanDeptId = this.$store.state.user.deptId;
this.form.pqSalesmanDeptName = this.$store.state.user.deptName;
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const pqId = row.pqId || this.ids
getZgys(pqId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改资格预审";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.pqId != null) {
updateZgys(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addZgys(this.form).then(response => {
this.$modal.msgSuccess("创建成功");
const row = {'pqId':response.data.pqId}
this.handleUpdate(row);
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const pqIds = row.pqId || this.ids;
this.$modal.confirm('是否确认删除资格预审编号为"' + pqIds + '"的数据项?').then(function() {
return delZgys(pqIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('zgys/zgys/export', {
...this.queryParams
}, `zgys_${new Date().getTime()}.xlsx`)
},
/** 打开客户选择弹窗 */
openCustomer(){
this.customerOpen=true;
},
/** 客户选择确定按钮事件 */
submitCustomer(customer){
this.form.pqCustomerBm = customer.value;
this.form.pqCustomerName = customer.label;
this.customerOpen=false;
},
}
};
</script>