add:页面

This commit is contained in:
zhangzq
2025-12-01 11:04:35 +08:00
parent ae280d1858
commit 20427934b5
48 changed files with 1905 additions and 586 deletions

View File

@@ -5,6 +5,7 @@ import lombok.Getter;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Collection; import java.util.Collection;
import java.util.function.Consumer;
/** /**
* s * s
@@ -16,11 +17,24 @@ public enum QueryTEnum {
// //
EQ((q, k, v) -> { q.eq(k[0],v); }), EQ((q, k, v) -> { q.eq(k[0],v); }),
IN((q, key, o) -> { if (o instanceof Collection){ q.in(key[0],(Collection) o); } }), IN((q, key, o) -> { if (o instanceof Collection){ q.in(key[0],(Collection) o); } }),
LK((q, keys, o) -> { for (String key : keys) { q.like(key,o); } }), LK((queryWrapper, keys, val) -> {
queryWrapper.nested((Consumer<QueryWrapper>) query -> {
query.like(keys[0], val);
for (int i = 1; i < keys.length; i++) {
query.or(true).like(keys[i], val);
}
});
}),
LE((q, k, v) -> { q.le(k[0],v); }), LE((q, k, v) -> { q.le(k[0],v); }),
GE((q, k, v) -> { q.ge(k[0],v); }),
BY((q, k, v) -> { q.orderByDesc(k[0],v); }), BY((q, k, v) -> { q.orderByDesc(k[0],v); }),
NO((q, k, v) -> { q.isNull(k[0]); }), NO((q, k, v) -> { q.isNull(k[0]); }),
LT((q, k, v) -> { q.lt(k[0],v); }), LT((q, k, v) -> { q.lt(k[0],v); }),
BT((q, k, v) -> { q.between(k[0],((Object[])v)[0],((Object[])v)[1]); }),
LASTSQL((q, k, o) -> {
q.eq("1","1");
q.last(String.valueOf(k[0]));
}),
OREQ((q, k, v) -> { if (StringUtils.isBlank((String)v)){ q.isNull(k[0]); }else { q.eq(k[0],v); } }); OREQ((q, k, v) -> { if (StringUtils.isBlank((String)v)){ q.isNull(k[0]); }else { q.eq(k[0],v); } });
private LConsumer<QueryWrapper,String[], Object> doP; private LConsumer<QueryWrapper,String[], Object> doP;

View File

@@ -1,5 +1,6 @@
package com.boge.modules.car.service.impl; package com.boge.modules.car.service.impl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Map; import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -18,12 +19,14 @@ public class CarServiceImpl extends ServiceImpl<CarDao, CarEntity> implements Ca
@Override @Override
public PageUtils queryPage(Map<String, Object> params) { public PageUtils queryPage(Map<String, Object> params) {
QueryWrapper<CarEntity> query = new QueryWrapper<>();
if (params.get("key") != null){
query.like("car_name",params.get("key"));
}
IPage<CarEntity> page = this.page( IPage<CarEntity> page = this.page(
new Query<CarEntity>().getPage(params), new Query<CarEntity>().getPage(params),query
new QueryWrapper<CarEntity>()
); );
return new PageUtils(page); return new PageUtils(page);
} }
} }

View File

@@ -3,6 +3,9 @@ package com.boge.modules.client.controller;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boge.common.query.PageQuery;
import com.boge.modules.client.entity.ClientQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@@ -18,7 +21,7 @@ import com.boge.common.utils.R;
/** /**
* *
* *
* @author ls * @author ls
* @email dengpbs@163.com * @email dengpbs@163.com
@@ -35,10 +38,9 @@ public class ClientController {
*/ */
@RequestMapping("/list") @RequestMapping("/list")
//@RequiresPermissions("client:client:list") //@RequiresPermissions("client:client:list")
public R list(@RequestParam Map<String, Object> params){ public R list(PageQuery page, ClientQuery query){
PageUtils page = clientService.queryPage(params); Page<ClientEntity> result = clientService.page(page.build(), query.build());
return R.ok().put("page", new PageUtils(result));
return R.ok().put("page", page);
} }

View File

@@ -0,0 +1,31 @@
package com.boge.modules.client.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.boge.common.query.BaseQuery;
import com.boge.common.query.QParam;
import com.boge.common.query.QueryTEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 公司
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 19:46:19
*/
@Data
public class ClientQuery extends BaseQuery<ClientEntity> {
private String key;
@Override
public void paramMapping() {
super.doP.put("key", QParam.builder().k(new String[]{"client_name"}).type(QueryTEnum.LK).build());
}
}

View File

@@ -26,4 +26,4 @@ public class ClientServiceImpl extends ServiceImpl<ClientDao, ClientEntity> impl
return new PageUtils(page); return new PageUtils(page);
} }
} }

View File

@@ -1,8 +1,12 @@
package com.boge.modules.contract.controller; package com.boge.modules.contract.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boge.common.query.PageQuery;
import com.boge.common.utils.PageUtils; import com.boge.common.utils.PageUtils;
import com.boge.common.utils.R; import com.boge.common.utils.R;
import com.boge.modules.client.entity.ClientQuery;
import com.boge.modules.contract.entity.ContractEntity; import com.boge.modules.contract.entity.ContractEntity;
import com.boge.modules.contract.entity.ContractQuery;
import com.boge.modules.contract.service.ContractService; import com.boge.modules.contract.service.ContractService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -30,10 +34,9 @@ public class ContractController {
*/ */
@RequestMapping("/list") @RequestMapping("/list")
//@RequiresPermissions("flow:contract:list") //@RequiresPermissions("flow:contract:list")
public R list(@RequestParam Map<String, Object> params){ public R list(PageQuery page, ContractQuery query){
PageUtils page = contractService.queryPage(params); Page<ContractEntity> entityPage = contractService.page(page.build(), query.build());
return R.ok().put("page", new PageUtils(entityPage));
return R.ok().put("page", page);
} }

View File

@@ -0,0 +1,35 @@
package com.boge.modules.contract.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.boge.common.query.BaseQuery;
import com.boge.common.query.QParam;
import com.boge.common.query.QueryTEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 19:33:35
*/
@Data
public class ContractQuery extends BaseQuery<ContractEntity> {
private Integer isValidity;
private Integer isAcceptance;
private Integer contractType;
private String contractNumber;
private String clientName;
@Override
public void paramMapping() {
super.doP.put("contractNumber", QParam.builder().k(new String[]{"contract_number"}).type(QueryTEnum.LK).build());
super.doP.put("clientName", QParam.builder().k(new String[]{"client_name"}).type(QueryTEnum.LK).build());
super.doP.put("startTime", QParam.builder().k(new String[]{"acceptance_time"}).type(QueryTEnum.LT).build());
super.doP.put("endTime", QParam.builder().k(new String[]{"acceptance_time"}).type(QueryTEnum.LE).build());
}
}

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.boge.common.query.PageQuery; import com.boge.common.query.PageQuery;
import com.boge.modules.dict.dao.Dict; import com.boge.modules.dict.dao.Dict;
import com.boge.modules.dict.dto.DictQuery; import com.boge.modules.dict.dto.DictQuery;
import liquibase.pro.packaged.I;
import java.util.List; import java.util.List;
@@ -85,4 +86,10 @@ public interface ISysDictService extends IService<Dict> {
* @return * @return
*/ */
List<Dict> queryAll(); List<Dict> queryAll();
/**
* 查询label,value
* @return
*/
Map<String, String> getAllLable();
} }

View File

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.boge.common.exception.RRException; import com.boge.common.exception.RRException;
import com.boge.common.query.MapOf;
import com.boge.common.query.PageQuery; import com.boge.common.query.PageQuery;
import com.boge.common.utils.ShiroUtils; import com.boge.common.utils.ShiroUtils;
import com.boge.modules.dict.dao.Dict; import com.boge.modules.dict.dao.Dict;
@@ -17,14 +18,12 @@ import com.boge.modules.dict.dao.mapper.SysDictMapper;
import com.boge.modules.dict.dto.DictQuery; import com.boge.modules.dict.dto.DictQuery;
import com.boge.modules.dict.service.ISysDictService; import com.boge.modules.dict.service.ISysDictService;
import com.boge.modules.sys.entity.SysUserEntity; import com.boge.modules.sys.entity.SysUserEntity;
import liquibase.pro.packaged.S;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/** /**
* <p> * <p>
@@ -202,4 +201,13 @@ public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, Dict> impleme
.groupBy(Dict::getCode, Dict::getName)); .groupBy(Dict::getCode, Dict::getName));
} }
@Override
public Map<String, String> getAllLable() {
List<Dict> dicts = sysDictMapper.selectList(new QueryWrapper<Dict>().select("value", "label"));
Map<String, String> result = new HashMap<>();
for (Dict dict : dicts) {
result.put(dict.getLabel(),dict.getValue());
}
return result;
}
} }

View File

@@ -1,24 +1,32 @@
package com.boge.modules.material.controller; package com.boge.modules.material.controller;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boge.common.query.PageQuery;
import com.boge.modules.dept.util.PageUtil;
import com.boge.modules.material.dao.MaterialQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import com.boge.modules.material.entity.MaterialEntity; import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.service.MaterialService; import com.boge.modules.material.service.MaterialService;
import com.boge.common.utils.PageUtils; import com.boge.common.utils.PageUtils;
import com.boge.common.utils.R; import com.boge.common.utils.R;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** /**
* *
* *
* @author ls * @author ls
* @email dengpbs@163.com * @email dengpbs@163.com
@@ -35,13 +43,11 @@ public class MaterialController {
*/ */
@RequestMapping("/list") @RequestMapping("/list")
//@RequiresPermissions("material:material:list") //@RequiresPermissions("material:material:list")
public R list(@RequestParam Map<String, Object> params){ public R list(PageQuery page, MaterialQuery query){
PageUtils page = materialService.queryPage(params); Page<MaterialEntity> entityPage = materialService.page(page.build(), query.build());
return R.ok().put("page", new PageUtils(entityPage));
return R.ok().put("page", page);
} }
/** /**
* 信息 * 信息
*/ */
@@ -64,6 +70,20 @@ public class MaterialController {
return R.ok(); return R.ok();
} }
/**
* 批量导入
* @param
* @return
*/
@PostMapping("/importExcel")
//@RequiresPermissions("material:material:save")
public R batchSave(@RequestParam("file") MultipartFile file){
List<String> list = materialService.importMarial(file);
if (!CollectionUtils.isEmpty(list)){
return R.error(list.stream().collect(Collectors.joining(",")));
}
return R.ok();
}
/** /**
* 修改 * 修改
*/ */

View File

@@ -0,0 +1,126 @@
package com.boge.modules.material.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boge.common.base.TableDataInfo;
import com.boge.common.query.PageQuery;
import com.boge.common.utils.R;
import com.boge.common.utils.ShiroUtils;
import com.boge.modules.material.dao.MaterialPriceQuery;
import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.entity.MaterialPriceEntity;
import com.boge.modules.material.service.MaterialPriceService;
import com.boge.modules.material.service.MaterialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
@RestController
@RequestMapping("materialPrice")
public class MaterialPriceController {
@Autowired
private MaterialService materialService;
@Autowired
private MaterialPriceService materialPriceService;
/**
* 信息
*/
@RequestMapping("/info")
//@RequiresPermissions("material:material:info")
public R info(PageQuery page, MaterialPriceQuery query){
page.setSort("id,desc");
Page<MaterialPriceEntity> entityPage = materialPriceService.page(page.build(), query.build());
return R.ok().put("data",entityPage.getRecords())
.put("page",page.getPage())
.put("size",page.getSize()).put("total",entityPage.getTotal());
}
/**
* 保存
*/
@RequestMapping("/save")
//@RequiresPermissions("material:material:save")
public R save(@RequestBody MaterialPriceEntity material){
material.setCreateTime(new Date());
material.setCreateName(ShiroUtils.getUserEntity().getNickname());
materialPriceService.save(material);
return R.ok();
}
/**
* 价格变动
*/
@RequestMapping("/use")
//@RequiresPermissions("material:material:save")
public R use(@RequestBody MaterialPriceEntity price){
materialService.update(new UpdateWrapper<MaterialEntity>()
.set("cost_price",price.getCostPrice())
.set("sale_price",price.getSalePrice())
.set("update_time",new Date())
.set("update_Name", ShiroUtils.getUserEntity().getNickname())
.set("sale_price",price.getSalePrice())
.eq("material_code",price.getMaterialCode()));
return R.ok();
}
/**
* 批量导入
* @param
* @return
*/
@PostMapping("/importExcel")
//@RequiresPermissions("material:material:save")
public R batchSave(@RequestParam("file") MultipartFile file){
List<String> list = materialService.importMarial(file);
if (!CollectionUtils.isEmpty(list)){
return R.error(list.stream().collect(Collectors.joining(",")));
}
return R.ok();
}
/**
* 修改单价
*/
@RequestMapping("/update")
//@RequiresPermissions("material:material:update")
public R update(@RequestBody MaterialEntity price){
Date date = new Date();
MaterialPriceEntity priceEntity = new MaterialPriceEntity();
priceEntity.setCostPrice(price.getCostPrice());
priceEntity.setSalePrice(price.getSalePrice());
priceEntity.setMaterialCode(price.getMaterialCode());
priceEntity.setCreateTime(date);
priceEntity.setCreateName(ShiroUtils.getUserEntity().getNickname());
materialPriceService.save(priceEntity);
price.setUpdateTime(date);
price.setUpdateName(ShiroUtils.getUserEntity().getNickname());
materialService.updateById(price);
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
//@RequiresPermissions("material:material:delete")
public R delete(@RequestBody Long[] materialIds){
materialPriceService.removeByIds(Arrays.asList(materialIds));
return R.ok();
}
}

View File

@@ -0,0 +1,18 @@
package com.boge.modules.material.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.entity.MaterialPriceEntity;
import org.apache.ibatis.annotations.Mapper;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
@Mapper
public interface MaterialPriceDao extends BaseMapper<MaterialPriceEntity> {
}

View File

@@ -0,0 +1,19 @@
package com.boge.modules.material.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.boge.common.query.BaseQuery;
import com.boge.modules.material.entity.MaterialPriceEntity;
import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
@Data
public class MaterialPriceQuery extends BaseQuery<MaterialPriceEntity> {
private String materialCode;
}

View File

@@ -0,0 +1,26 @@
package com.boge.modules.material.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.boge.common.query.BaseQuery;
import com.boge.common.query.QParam;
import com.boge.common.query.QueryTEnum;
import com.boge.modules.material.entity.MaterialEntity;
import lombok.Data;
import org.apache.ibatis.annotations.Mapper;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
@Data
public class MaterialQuery extends BaseQuery<MaterialEntity> {
private String key;
@Override
public void paramMapping() {
super.doP.put("key", QParam.builder().k(new String[]{"material_code","material_name"}).type(QueryTEnum.LK).build());
}
}

View File

@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import liquibase.pro.packaged.S;
import lombok.Data; import lombok.Data;
/** /**
@@ -53,6 +53,18 @@ public class MaterialEntity implements Serializable {
/** /**
* 创建时间 * 创建时间
*/ */
private Date createTime; private Date updateTime;
/**
* 创建人
*/
private String updateName;
/**
* 成本价
*/
private BigDecimal costPrice;
/**
* 销售价
*/
private BigDecimal salePrice;
} }

View File

@@ -0,0 +1,51 @@
package com.boge.modules.material.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
@Data
@TableName("sys_material_price")
public class MaterialPriceEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId
private Long id;
/**
* 物料编码
*/
private String materialCode;
/**
* 成本价
*/
private BigDecimal costPrice;
/**
* 销售价
*/
private BigDecimal salePrice;
/**
* 创建时间
*/
private Date createTime;
/**
* 物料编码
*/
private String createName;
}

View File

@@ -0,0 +1,23 @@
package com.boge.modules.material.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.boge.common.utils.PageUtils;
import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.entity.MaterialPriceEntity;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 20:06:39
*/
public interface MaterialPriceService extends IService<MaterialPriceEntity> {
List<String> importMarial(MultipartFile file);
}

View File

@@ -3,11 +3,13 @@ package com.boge.modules.material.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.boge.common.utils.PageUtils; import com.boge.common.utils.PageUtils;
import com.boge.modules.material.entity.MaterialEntity; import com.boge.modules.material.entity.MaterialEntity;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* *
* *
* @author ls * @author ls
* @email dengpbs@163.com * @email dengpbs@163.com
@@ -16,5 +18,7 @@ import java.util.Map;
public interface MaterialService extends IService<MaterialEntity> { public interface MaterialService extends IService<MaterialEntity> {
PageUtils queryPage(Map<String, Object> params); PageUtils queryPage(Map<String, Object> params);
List<String> importMarial(MultipartFile file);
} }

View File

@@ -0,0 +1,66 @@
package com.boge.modules.material.service.impl;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.boge.common.exception.RRException;
import com.boge.common.utils.PageUtils;
import com.boge.common.utils.Query;
import com.boge.modules.dict.service.ISysDictService;
import com.boge.modules.material.dao.MaterialDao;
import com.boge.modules.material.dao.MaterialPriceDao;
import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.entity.MaterialPriceEntity;
import com.boge.modules.material.service.MaterialPriceService;
import com.boge.modules.material.service.MaterialService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
@Service()
public class MaterialPriceServiceImpl extends ServiceImpl<MaterialPriceDao, MaterialPriceEntity> implements MaterialPriceService {
@Override
public List<String> importMarial(MultipartFile file){
if (file==null){
throw new RRException("文件不存在");
}
List<String> errorInfo = new ArrayList<>();
List<MaterialEntity> entitys = new ArrayList<>();
Map<String, Integer> codeLine = new HashMap<>();
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
List<List<Object>> read = excelReader.read();
Date date = new Date();
for (int i = 1; i < read.size(); i++) {
List<Object> row = read.get(i);
}
if (CollectionUtils.isEmpty(errorInfo)){
}
}catch (Exception ex){
throw new RRException(ex.getMessage());
}finally {
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return errorInfo;
}
}

View File

@@ -1,7 +1,24 @@
package com.boge.modules.material.service.impl; package com.boge.modules.material.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.boge.common.exception.RRException;
import com.boge.common.utils.ShiroUtils;
import com.boge.modules.dict.service.ISysDictService;
import lombok.val;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Map;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -11,11 +28,16 @@ import com.boge.common.utils.Query;
import com.boge.modules.material.dao.MaterialDao; import com.boge.modules.material.dao.MaterialDao;
import com.boge.modules.material.entity.MaterialEntity; import com.boge.modules.material.entity.MaterialEntity;
import com.boge.modules.material.service.MaterialService; import com.boge.modules.material.service.MaterialService;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
@Service("materialService") @Service("materialService")
public class MaterialServiceImpl extends ServiceImpl<MaterialDao, MaterialEntity> implements MaterialService { public class MaterialServiceImpl extends ServiceImpl<MaterialDao, MaterialEntity> implements MaterialService {
@Autowired
private ISysDictService iSysDictService;
@Override @Override
public PageUtils queryPage(Map<String, Object> params) { public PageUtils queryPage(Map<String, Object> params) {
IPage<MaterialEntity> page = this.page( IPage<MaterialEntity> page = this.page(
@@ -26,4 +48,72 @@ public class MaterialServiceImpl extends ServiceImpl<MaterialDao, MaterialEntity
return new PageUtils(page); return new PageUtils(page);
} }
} @Override
public List<String> importMarial(MultipartFile file){
if (file==null){
throw new RRException("文件不存在");
}
List<String> errorInfo = new ArrayList<>();
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
List<List<Object>> read = excelReader.read();
List<MaterialEntity> entitys = new ArrayList<>();
Map<String, Integer> codeLine = new HashMap<>();
Map<String, String> allLable = iSysDictService.getAllLable();
Date date = new Date();
String user = ShiroUtils.getUserEntity().getNickname();
for (int i = 1; i < read.size(); i++) {
List<Object> row = read.get(i);
if (CollectionUtils.isEmpty(row)){
continue;
}
if (row.size()<5){
errorInfo.add("当前行"+i+":"+"参数不全");
continue;
}
codeLine.put(String.valueOf( row.get(0)),i);
String type = allLable.get(String.valueOf(row.get(4)));
if (StringUtils.isEmpty(type)){
errorInfo.add("当前行"+i+":"+"物料类型不存在");
continue;
}
MaterialEntity entity = new MaterialEntity();
entity.setMaterialCode(String.valueOf( row.get(0)));
entity.setMaterialName(String.valueOf( row.get(1)));
entity.setMaterialSpec(String.valueOf( row.get(2)));
entity.setUnitName(String.valueOf( row.get(3)));
entity.setUpdateTime(date);
entity.setUpdateName(user);
entity.setMaterialType(Integer.valueOf(type));
entitys.add(entity);
}
List<String> materialCodes = entitys.stream().map(MaterialEntity::getMaterialCode).collect(Collectors.toList());
List<MaterialEntity> has = this.baseMapper.selectList(new QueryWrapper<MaterialEntity>()
.in("material_code", materialCodes));
if (!CollectionUtils.isEmpty(has)){
has.forEach(a->{
Integer integer = codeLine.get(a.getMaterialCode());
errorInfo.add("当前行"+integer+":"+a.getMaterialCode()+"编码数据已存在");
});
}
if (CollectionUtils.isEmpty(errorInfo)){
this.saveBatch(entitys);
}
}catch (Exception ex){
throw new RRException(ex.getMessage());
}finally {
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
return errorInfo;
}
}

View File

@@ -38,24 +38,20 @@ public class PriceEntity implements Serializable {
*/ */
private String quoter; private String quoter;
/** /**
* 接收人 * 发货方信息
*/ */
private String fattn; private String fattn;
/** private String fmobile;
* 联系方式 private String finc;
*/ private String fadd;
private String ftel; private String ftel;
/** /**
* 客户id * 收货方信息
*/
private Long clientId;
/**
* 客户接收人
*/ */
private String tattn; private String tattn;
/** private String tmobile;
* 客户接收人联系方法 private String tinc;
*/ private String tadd;
private String ttel; private String ttel;
/** /**
* 物料信息 * 物料信息

View File

@@ -1,8 +1,13 @@
package com.boge.modules.project.contract.controller; package com.boge.modules.project.contract.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boge.common.query.PageQuery;
import com.boge.common.utils.PageUtils; import com.boge.common.utils.PageUtils;
import com.boge.common.utils.R; import com.boge.common.utils.R;
import com.boge.modules.contract.entity.ContractEntity;
import com.boge.modules.contract.entity.ContractQuery;
import com.boge.modules.project.contract.entity.ProjectContractEntity; import com.boge.modules.project.contract.entity.ProjectContractEntity;
import com.boge.modules.project.contract.entity.ProjectContractQuery;
import com.boge.modules.project.contract.service.ProjectContractService; import com.boge.modules.project.contract.service.ProjectContractService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -30,13 +35,11 @@ public class ProjectContractController {
*/ */
@RequestMapping("/list") @RequestMapping("/list")
//@RequiresPermissions("flow:contract:list") //@RequiresPermissions("flow:contract:list")
public R list(@RequestParam Map<String, Object> params){ public R list(PageQuery page, ProjectContractQuery query) {
PageUtils page = contractService.queryPage(params); Page<ProjectContractEntity> entityPage = contractService.page(page.build(), query.build());
return R.ok().put("page", new PageUtils(entityPage));
return R.ok().put("page", page);
} }
/** /**
* 信息 * 信息
*/ */

View File

@@ -42,6 +42,10 @@ public class ProjectContractEntity implements Serializable {
* 客户id * 客户id
*/ */
private Long clientId; private Long clientId;
/**
* 客户id
*/
private String clientName;
/** /**
* 物料信息 * 物料信息
*/ */

View File

@@ -0,0 +1,33 @@
package com.boge.modules.project.contract.entity;
import com.boge.common.query.BaseQuery;
import com.boge.common.query.QParam;
import com.boge.common.query.QueryTEnum;
import com.boge.modules.contract.entity.ContractEntity;
import lombok.Data;
/**
*
*
* @author ls
* @email dengpbs@163.com
* @date 2025-02-26 19:33:35
*/
@Data
public class ProjectContractQuery extends BaseQuery<ProjectContractEntity> {
private Integer isValidity;
private Integer isAcceptance;
private Integer contractType;
private String contractNumber;
private String[] acceptanceTime;
private String clientName;
@Override
public void paramMapping() {
super.doP.put("contractNumber", QParam.builder().k(new String[]{"contract_number"}).type(QueryTEnum.LK).build());
super.doP.put("clientName", QParam.builder().k(new String[]{"client_name"}).type(QueryTEnum.LK).build());
super.doP.put("startTime", QParam.builder().k(new String[]{"acceptance_time"}).type(QueryTEnum.GE).build());
super.doP.put("endTime", QParam.builder().k(new String[]{"acceptance_time"}).type(QueryTEnum.LE).build());
super.doP.put("isValidity", QParam.builder().k(new String[]{"AND NOW()"+(Integer.valueOf(1).equals(isValidity)?"<=":">")+" DATE_ADD(acceptance_time, INTERVAL validity DAY)"}).type(QueryTEnum.LASTSQL).build());
}
}

View File

@@ -50,7 +50,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserDao, SysUserEntity> i
@Override @Override
public PageUtils queryPage(Map<String, Object> params) { public PageUtils queryPage(Map<String, Object> params) {
String username = (String)params.get("username"); String username = (String)params.get("username");
Long createUserId = (Long)params.get("createUserId");
IPage<SysUserEntity> page = this.page( IPage<SysUserEntity> page = this.page(
new Query<SysUserEntity>().getPage(params), new Query<SysUserEntity>().getPage(params),
new QueryWrapper<SysUserEntity>() new QueryWrapper<SysUserEntity>()

View File

@@ -24,7 +24,7 @@ import './style/bpmn-custom-color.css' // 导入自定义的样式文件
Vue.prototype.$echarts = echarts; Vue.prototype.$echarts = echarts;
Vue.use(VueCookie) Vue.use(VueCookie)
Vue.use(ElementUI) Vue.use(ElementUI)
Vue.config.productionTip = false Vue.config.productionTip = true
// 非生产环境, 适配mockjs模拟数据 // api: https://github.com/nuysoft/Mock // 非生产环境, 适配mockjs模拟数据 // api: https://github.com/nuysoft/Mock
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {

View File

@@ -0,0 +1,128 @@
<template>
<el-dialog
title="导入Excel文件"
append-to-body
:visible.sync="dialogVisible"
destroy-on-close
width="400px"
:show-close="true"
@close="close"
@open="open"
>
<el-upload
ref="upload"
class="upload-demo"
action=""
drag
:on-exceed="is_one"
:limit="1"
:auto-upload="false"
:multiple="false"
:show-file-list="true"
:on-change="uploadByJsqd"
:file-list="fileList"
accept=".xlsx,.xls"
>
<i class="el-icon-upload" />
<div class="el-upload__text">
将文件拖到此处
<em>点击上传</em>
</div>
<div slot="tip" class="el-upload__tip">只能上传Excel文件且不超过10MB</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="close()"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</el-dialog>
</template>
<script>
export default {
name: 'UploadDialog',
mixins: [],
components: {},
props: {
dialogShow: {
type: Boolean,
default: false
},
openParam: {
type: String
},
urlApi: ''
},
data() {
return {
dialogVisible: false,
fileList: [],
file1: ''
}
},
watch: {
dialogShow: {
handler(newValue, oldValue) {
this.dialogVisible = newValue
}
},
openParam: {
handler(newValue, oldValue) {
this.opendtlParam = newValue
}
}
},
methods: {
open() {
},
close() {
this.$emit('update:dialogShow', false)
},
is_one() {
this.$message.error('只能上传一个excel文件')
},
// 文件校验方法
beforeAvatarUpload(file) {
// 不能导入大小超过2Mb的文件
if (file.size > 10 * 1024 * 1024) {
return false
}
return true
},
// 文件发生改变就会触发的事件
uploadByJsqd (file) {
this.file1 = file
},
submit () {
if (this.beforeAvatarUpload(this.file1)) {
this.fileList.name = this.file1.name
this.fileList.url = ''
var formdata = new FormData()
formdata.append('file', this.file1.raw)
// excelImport请求接口 formdata传递参数
debugger
this.$http({
url: this.$http.adornUrl(this.urlApi),
method: 'post',
data: formdata
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
this.$emit('event-close', false)
} else {
this.$message.error(data.msg)
}
})
}
}
}
}
</script>

View File

@@ -227,10 +227,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="id"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialCode" prop="materialCode"

View File

@@ -2,7 +2,7 @@
<div class="mod-config"> <div class="mod-config">
<el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()"> <el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()">
<el-form-item> <el-form-item>
<el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input> <el-input v-model="dataForm.key" placeholder="车辆名称" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="getDataList()">查询</el-button> <el-button @click="getDataList()">查询</el-button>
@@ -24,10 +24,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="carId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="carName" prop="carName"

View File

@@ -2,7 +2,7 @@
<div class="mod-config"> <div class="mod-config">
<el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()"> <el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()">
<el-form-item> <el-form-item>
<el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input> <el-input v-model="dataForm.key" placeholder="客户名称" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="getDataList()">查询</el-button> <el-button @click="getDataList()">查询</el-button>
@@ -24,10 +24,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="clientId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="clientName" prop="clientName"

View File

@@ -227,10 +227,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="id"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialCode" prop="materialCode"

View File

@@ -24,10 +24,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialType" prop="materialType"

View File

@@ -2,11 +2,12 @@
<div class="mod-config"> <div class="mod-config">
<el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()"> <el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()">
<el-form-item> <el-form-item>
<el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input> <el-input v-model="dataForm.key" placeholder="物料编码,名称或规格" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="getDataList()">查询</el-button> <el-button @click="getDataList()">查询</el-button>
<el-button v-if="isAuth('material:material:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button> <el-button v-if="isAuth('material:material:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>
<el-button type="primary" @click="uploadShow = true">导入</el-button>
<el-button v-if="isAuth('material:material:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button> <el-button v-if="isAuth('material:material:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@@ -24,10 +25,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialCode" prop="materialCode"
@@ -71,10 +72,16 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="createTime" prop="updateTime"
header-align="center" header-align="center"
align="center" align="center"
label="创建时间"> label="操作人">
</el-table-column>
<el-table-column
prop="updateName"
header-align="center"
align="center"
label="操作人">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
fixed="right" fixed="right"
@@ -99,18 +106,22 @@
</el-pagination> </el-pagination>
<!-- 弹窗, 新增 / 修改 --> <!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" :dictData="dictData" @refreshDataList="getDataList"></add-or-update> <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" :dictData="dictData" @refreshDataList="getDataList"></add-or-update>
<UploadDialog :dialog-show.sync="uploadShow" @event-close="closeUpload" urlApi='/material/material/importExcel' />
</div> </div>
</template> </template>
<script> <script>
import AddOrUpdate from './material-add-or-update' import AddOrUpdate from './material-add-or-update'
import { apiUtils } from '@/utils/dict' import { apiUtils } from '@/utils/dict'
import UploadDialog from '../../common/UploadDialog'
export default { export default {
data () { data () {
return { return {
dataForm: { dataForm: {
key: '' key: ''
}, },
uploadShow: false,
dataList: [], dataList: [],
pageIndex: 1, pageIndex: 1,
pageSize: 10, pageSize: 10,
@@ -124,7 +135,7 @@
}, },
mixins: [apiUtils], mixins: [apiUtils],
components: { components: {
AddOrUpdate AddOrUpdate, UploadDialog
}, },
activated () { activated () {
this.getDataList() this.getDataList()
@@ -152,6 +163,10 @@
this.dataListLoading = false this.dataListLoading = false
}) })
}, },
closeUpload () {
this.uploadShow = false
this.getDataList()
},
// 每页数 // 每页数
sizeChangeHandle (val) { sizeChangeHandle (val) {
this.pageSize = val this.pageSize = val

View File

@@ -0,0 +1,127 @@
<template>
<el-dialog
:title="!dataForm.materialId ? '新增' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible"
width="500px">
<el-form :model="dataForm" :rules="dataRule" size="mini" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="80px">
<el-form-item label="物料编码" prop="materialCode">
<el-input disabled v-model="dataForm.materialCode" placeholder="物料编码"></el-input>
</el-form-item>
<el-form-item label="物料名称" prop="materialName">
<el-input disabled v-model="dataForm.materialName" placeholder="物料名称"></el-input>
</el-form-item>
<el-form-item label="物料规格" prop="materialSpec">
<el-input disabled v-model="dataForm.materialSpec" placeholder="物料名称"></el-input>
</el-form-item>
<el-form-item label="成本价" prop="costPrice">
<el-input-number precision="2" v-model="dataForm.costPrice" placeholder="成本价"></el-input-number>
</el-form-item>
<el-form-item label="销售价" prop="salePrice">
<el-input-number precision="2" v-model="dataForm.salePrice" placeholder="销售价"></el-input-number>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="mini" @click="visible = false">取消</el-button>
<el-button size="mini" type="primary" @click="dataFormSubmit()">确定</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
data () {
return {
visible: false,
dataForm: {
materialId: 0,
materialCode: '',
materialName: '',
materialSpec: '',
costPrice: '',
salePrice: '',
unitName: '',
materialType: '',
isOn: 0
},
dataRule: {
materialCode: [
{ required: true, message: '物料编码不能为空', trigger: 'blur' }
],
materialName: [
{ required: true, message: '物料名称不能为空', trigger: 'blur' }
],
materialType: [
{ required: true, message: '物料类型不能为空', trigger: 'blur' }
]
}
}
},
props: {
dictData: Array
},
methods: {
init (id) {
this.dataForm.materialId = id || 0
this.visible = true
this.$nextTick(() => {
this.$refs['dataForm'].resetFields()
if (this.dataForm.materialId) {
this.$http({
url: this.$http.adornUrl(`/material/material/info/${this.dataForm.materialId}`),
method: 'get',
params: this.$http.adornParams()
}).then(({data}) => {
if (data && data.code === 0) {
this.dataForm.materialCode = data.material.materialCode
this.dataForm.materialName = data.material.materialName
this.dataForm.unitName = data.material.unitName
this.dataForm.costPrice = data.material.costPrice
this.dataForm.salePrice = data.material.salePrice
this.dataForm.materialSpec = data.material.materialSpec
this.dataForm.materialType = String(data.material.materialType)
this.dataForm.isOn = data.material.isOn
}
})
}
})
},
// 表单提交
dataFormSubmit () {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
this.$http({
url: this.$http.adornUrl(`/materialPrice/${!this.dataForm.materialId ? 'save' : 'update'}`),
method: 'post',
data: this.$http.adornData({
'materialId': this.dataForm.materialId || undefined,
'materialCode': this.dataForm.materialCode,
'materialName': this.dataForm.materialName,
'materialSpec': this.dataForm.materialSpec,
'costPrice': this.dataForm.costPrice,
'salePrice': this.dataForm.salePrice,
'unitName': this.dataForm.unitName,
'materialType': this.dataForm.materialType,
'isOn': this.dataForm.isOn
})
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
} else {
this.$message.error(data.msg)
}
})
}
})
}
}
}
</script>

View File

@@ -0,0 +1,224 @@
<template>
<div class="mod-config">
<el-form :inline="true" :model="dataForm" size="mini" @keyup.enter.native="getDataList()">
<el-form-item>
<el-input v-model="dataForm.key" placeholder="物料编码,名称或规格" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()">查询</el-button>
<!-- <el-button v-if="isAuth('material:material:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>-->
<el-button type="primary" @click="uploadShow = true">导入</el-button>
<!-- <el-button v-if="isAuth('material:material:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button>-->
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
size="mini"
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%;">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
type="index"
header-align="center"
align="center"
label="序号">
</el-table-column>
<el-table-column
prop="materialCode"
header-align="center"
align="center"
label="物料编码">
<template slot-scope="scope">
<el-link type="warning" @click="toView( scope.row.materialCode)">{{ scope.row.materialCode }}</el-link>
</template>
</el-table-column>
<el-table-column
prop="materialName"
header-align="center"
align="center"
label="物料名称">
</el-table-column>
<el-table-column
prop="materialSpec"
header-align="center"
align="center"
label="物料规格">
</el-table-column>
<el-table-column
prop="costPrice"
header-align="center"
align="center"
label="成本价">
</el-table-column>
<el-table-column
prop="salePrice"
header-align="center"
align="center"
label="销售价">
</el-table-column>
<el-table-column
prop="updateTime"
header-align="center"
align="center"
label="操作时间">
</el-table-column>
<el-table-column
prop="updateName"
header-align="center"
align="center"
label="操作人">
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.materialId)">修改</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" :dictData="dictData" @refreshDataList="getDataList"></add-or-update>
<UploadDialog :dialog-show.sync="uploadShow" @event-close="closeUpload" urlApi='/material/material/importExcel' />
<PriceList ref="priceList" :dialog-show.sync="priceView" @refreshDataList="getDataList"/>
</div>
</template>
<script>
import AddOrUpdate from './material-add-or-update'
import { apiUtils } from '@/utils/dict'
import UploadDialog from '../../common/UploadDialog'
import PriceList from './price-list'
export default {
data () {
return {
dataForm: {
key: ''
},
uploadShow: false,
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
priceView: false,
dictConfigs: [{type: 'dict', code: 'material_type'}],
dictData: []
}
},
mixins: [apiUtils],
components: {
AddOrUpdate, UploadDialog, PriceList
},
activated () {
this.getDataList()
},
methods: {
// 获取数据列表
toView (materialCode) {
this.$nextTick(() => {
this.$refs.priceList.init(materialCode)
})
},
getDataList () {
this.dataListLoading = true
this.$http({
url: this.$http.adornUrl('/material/material/list'),
method: 'get',
params: this.$http.adornParams({
'page': this.pageIndex,
'limit': this.pageSize,
'key': this.dataForm.key
})
}).then(({data}) => {
if (data && data.code === 0) {
this.dataList = data.page.list
this.totalPage = data.page.totalCount
} else {
this.dataList = []
this.totalPage = 0
}
this.dataListLoading = false
})
},
closeUpload () {
this.uploadShow = false
this.getDataList()
},
// 每页数
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
// 多选
selectionChangeHandle (val) {
this.dataListSelections = val
},
// 新增 / 修改
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
// 删除
deleteHandle (id) {
var ids = id ? [id] : this.dataListSelections.map(item => {
return item.materialId
})
this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$http({
url: this.$http.adornUrl('/material/material/delete'),
method: 'post',
data: this.$http.adornData(ids, false)
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.getDataList()
}
})
} else {
this.$message.error(data.msg)
}
})
}).catch(() => {})
}
}
}
</script>

View File

@@ -0,0 +1,171 @@
<template>
<el-dialog
:title="维护记录"
:close-on-click-modal="false"
:visible.sync="priceView">
<el-table
:data="dataList"
border
size="mini"
max-height="400"
style="width: 100%;">
<el-table-column
type="index"
header-align="center"
align="center"
label="序号">
</el-table-column>
<el-table-column
prop="materialCode"
header-align="center"
align="center"
label="物料编码">
</el-table-column>
<el-table-column
prop="costPrice"
header-align="center"
align="center"
label="成本价">
</el-table-column>
<el-table-column
prop="salePrice"
header-align="center"
align="center"
label="销售价">
</el-table-column>
<el-table-column
prop="createTime"
header-align="center"
align="center"
label="创建时间">
</el-table-column>
<el-table-column
prop="createName"
header-align="center"
align="center"
label="创建人">
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="usePrice(scope.row)">启用</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<span slot="footer" class="dialog-footer">
<el-button size="mini" @click="closeView">关闭</el-button>
</span>
</el-dialog>
</template>
<script>
export default {
data () {
return {
priceView: false,
materialCode: '',
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
headers: { 'Token': this.$cookie.get('token') }
}
},
methods: {
init (materialCode) {
this.dataList = []
this.materialCode = materialCode
this.priceView = true
this.$nextTick(() => {
this.$http({
url: this.$http.adornUrl(`/materialPrice/info`),
method: 'get',
params: this.$http.adornParams({
'page': this.pageIndex,
'size': this.pageSize,
'materialCode': materialCode
})
}).then(({data}) => {
if (data && data.code === 0) {
this.dataList = data.data
this.totalPage = data.total
}
})
})
},
// 表单提交
usePrice (price) {
this.$http({
url: this.$http.adornUrl(`/materialPrice/use`),
method: 'post',
data: price
}).then(({data}) => {
if (data && data.code === 0) {
this.$message({
message: '操作成功',
type: 'success',
duration: 1500,
onClose: () => {
this.$refs.upload.clearFiles()
this.activeName = 'first'
this.visible = false
this.$emit('refreshDataList')
}
})
} else {
this.$message.error(data.msg)
}
})
},
// 每页数
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.init(this.materialCode)
},
// 当前页
currentChangeHandle (val) {
this.pageIndex = val
this.init(this.materialCode)
},
closeView (val) {
// eslint-disable-next-line no-unused-expressions,no-sequences
this.priceView = false,
this.materialCode = '',
this.dataList = []
this.$emit('refreshDataList')
}
}
}
</script>
<style scoped>
.tab_box_wraper {
width: 460px;
}
.file-item {
border: 1px solid #eee;
padding: 5px 8px 5px 15px;
}
.file-item-name {
font-size: 14px;
color: #333;
}
.el-pagination {
margin-top: 15px;
text-align: right;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -150,7 +150,7 @@
dataListSelections: [], dataListSelections: [],
addOrUpdateVisible: false, addOrUpdateVisible: false,
tempVisible: false, tempVisible: false,
dictConfigs: [{type: 'dict', code: 'contract_type'}, {url: '/client/client/list', type: 'list', value: 'clientId', label: 'clientName'}], dictConfigs: [{type: 'dict', code: 'contract_type'}, {url: '/client/client/list', type: 'list', value: 'clientId', label: 'clientName'}, {url: '/sys/user/list', type: 'list', value: 'userId', label: 'username'}],
statusOpt: [{value: '1', label: '未审核'}, {value: '2', label: '审核通过'}, {value: '3', label: '审核驳回'}] statusOpt: [{value: '1', label: '未审核'}, {value: '2', label: '审核通过'}, {value: '3', label: '审核驳回'}]
} }
}, },

View File

@@ -18,7 +18,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="合同编号" prop="contractNumber"> <el-form-item label="合同编号" prop="contractNumber">
<el-input v-model="dataForm.contractNumber" placeholder="合同编号"></el-input> <el-input disabled v-model="dataForm.contractNumber" placeholder="系统生成"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="是否是主合同" prop="isMaster"> <el-form-item label="是否是主合同" prop="isMaster">
<el-switch <el-switch
@@ -243,10 +243,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="id"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialCode" prop="materialCode"
@@ -314,9 +314,6 @@
contractType: [ contractType: [
{ required: true, message: '合同类型不能为空', trigger: 'blur' } { required: true, message: '合同类型不能为空', trigger: 'blur' }
], ],
contractNumber: [
{ required: true, message: '合同编号不能为空', trigger: 'blur' }
],
clientId: [ clientId: [
{ required: true, message: '客户不能为空', trigger: 'blur' } { required: true, message: '客户不能为空', trigger: 'blur' }
] ]

View File

@@ -1,8 +1,51 @@
<template> <template>
<div class="mod-config"> <div class="mod-config">
<el-form size="mini" :inline="true" :model="dataForm" @keyup.enter.native="getDataList()"> <el-form size="mini" :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form-item> <el-form-item label="客户名称">
<el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input> <el-input v-model="dataForm.clientName" placeholder="客户名称" clearable></el-input>
</el-form-item>
<el-form-item label="合同编号">
<el-input v-model="dataForm.contractNumber" placeholder="合同编号" clearable></el-input>
</el-form-item>
<el-form-item label="合同类型">
<el-select v-model="dataForm.contractType" placeholder="请选择合同类型" clearable>
<el-option
v-for="item in dictData[0]"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="合同日期">
<el-date-picker
v-model="dataForm.acceptanceTime"
type="daterange"
:default-time="['00:00:00', '23:59:59']"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="是否验收">
<el-select v-model="dataForm.isAcceptance" placeholder="是否验收" clearable>
<el-option
v-for="item in dictData[2]"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否在保">
<el-select v-model="dataForm.isValidity" placeholder="是否在保" clearable>
<el-option
v-for="item in dictData[2]"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="getDataList()">查询</el-button> <el-button @click="getDataList()">查询</el-button>
@@ -128,7 +171,12 @@
data () { data () {
return { return {
dataForm: { dataForm: {
key: '' isValidity: null,
isAcceptance: null,
acceptanceTime: [],
contractType: null,
contractNumber: null,
clientName: null
}, },
dataList: [], dataList: [],
pageIndex: 1, pageIndex: 1,
@@ -138,7 +186,7 @@
dataListSelections: [], dataListSelections: [],
addOrUpdateVisible: false, addOrUpdateVisible: false,
tempVisible: false, tempVisible: false,
dictConfigs: [{type: 'dict', code: 'contract_type'}, {url: '/client/client/list', type: 'list', value: 'clientId', label: 'clientName'}], dictConfigs: [{type: 'dict', code: 'contract_type'}, {url: '/client/client/list', type: 'list', value: 'clientId', label: 'clientName'}, {type: 'dict', code: 'onoff'}],
} }
}, },
mixins: [apiUtils], mixins: [apiUtils],
@@ -153,13 +201,26 @@
// 获取数据列表 // 获取数据列表
getDataList () { getDataList () {
this.dataListLoading = true this.dataListLoading = true
let startTime = null
let endTime = null
if (this.dataForm.acceptanceTime != null && this.dataForm.acceptanceTime.length > 1){
// eslint-disable-next-line no-unused-expressions
startTime = this.dataForm.acceptanceTime[0]
endTime = this.dataForm.acceptanceTime[1]
}
this.$http({ this.$http({
url: this.$http.adornUrl('/flow/projectContract/list'), url: this.$http.adornUrl('/flow/projectContract/list'),
method: 'get', method: 'get',
params: this.$http.adornParams({ params: this.$http.adornParams({
'page': this.pageIndex, 'page': this.pageIndex,
'limit': this.pageSize, 'limit': this.pageSize,
'key': this.dataForm.key 'isValidity': this.dataForm.isValidity,
'isAcceptance': this.dataForm.isAcceptance,
'startTime': startTime,
'endTime': endTime,
'contractType': this.dataForm.contractType,
'contractNumber': this.dataForm.contractNumber,
'clientName': this.dataForm.clientName
}) })
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {

View File

@@ -24,10 +24,10 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialId" type="index"
header-align="center" header-align="center"
align="center" align="center"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="materialCode" prop="materialCode"

View File

@@ -23,11 +23,11 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="id" type="index"
header-align="center" header-align="center"
align="center" align="center"
width="80" width="80"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="paramKey" prop="paramKey"

View File

@@ -15,11 +15,11 @@
v-loading="dataListLoading" v-loading="dataListLoading"
style="width: 100%"> style="width: 100%">
<el-table-column <el-table-column
prop="id" type="index"
header-align="center" header-align="center"
align="center" align="center"
width="80" width="80"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="username" prop="username"

View File

@@ -24,11 +24,11 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="roleId" type="index"
header-align="center" header-align="center"
align="center" align="center"
width="80" width="80"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="roleName" prop="roleName"

View File

@@ -25,11 +25,11 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="userId" type="index"
header-align="center" header-align="center"
align="center" align="center"
width="80" width="80"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="username" prop="username"

View File

@@ -21,11 +21,11 @@
width="50"> width="50">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="userId" type="index"
header-align="center" header-align="center"
align="center" align="center"
width="80" width="80"
label="ID"> label="序号">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="username" prop="username"

View File

@@ -1,3 +1,3 @@
import Vue from 'vue' import Vue from 'vue'
Vue.config.productionTip = false Vue.config.productionTip = true