Lijingyang před 1 měsícem
rodič
revize
6f97034d2a

+ 4 - 2
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/SupplierAuthorizeController.java

@@ -81,10 +81,12 @@ public class SupplierAuthorizeController extends BaseController {
     }
     }
 
 
     @GetMapping("/getDetailList")
     @GetMapping("/getDetailList")
-    public R<List<SupplierAuthorizeVo>> getDetailList(SupplierAuthorizeBo bo) {
-        return R.ok(supplierAuthorizeService.srmgetAuthorizeDetailList(bo));
+    public TableDataInfo<SupplierAuthorizeVo> getDetailList(SupplierAuthorizeBo bo, PageQuery pageQuery) {
+        return supplierAuthorizeService.srmgetAuthorizeDetailList(bo,pageQuery);
     }
     }
 
 
+
+
     @GetMapping("/getBrandAuthorizeDetail")
     @GetMapping("/getBrandAuthorizeDetail")
     public R<SupplierAuthorizeVo> getBrandAuthorizeDetail(@RequestParam Long id) {
     public R<SupplierAuthorizeVo> getBrandAuthorizeDetail(@RequestParam Long id) {
         return R.ok(supplierAuthorizeService.getBrandAuthorizeDetail(id));
         return R.ok(supplierAuthorizeService.getBrandAuthorizeDetail(id));

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ISupplierAuthorizeService.java

@@ -71,7 +71,7 @@ public interface ISupplierAuthorizeService extends IService<SupplierAuthorize>{
 
 
     TableDataInfo<SupplierAuthorizeVo> getAuthorizeDetailList(Long supplierId,PageQuery pageQuery);
     TableDataInfo<SupplierAuthorizeVo> getAuthorizeDetailList(Long supplierId,PageQuery pageQuery);
 
 
-    List<SupplierAuthorizeVo> srmgetAuthorizeDetailList(SupplierAuthorizeBo  bo);
+    TableDataInfo<SupplierAuthorizeVo> srmgetAuthorizeDetailList(SupplierAuthorizeBo bo,PageQuery pageQuery);
 
 
     TableDataInfo<SupplierAuthorizeVo> getSupplyCapacityList(SupplierAuthorizeBo bo, PageQuery pageQuery);
     TableDataInfo<SupplierAuthorizeVo> getSupplyCapacityList(SupplierAuthorizeBo bo, PageQuery pageQuery);
 
 

+ 1 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/ContractSupplyServiceImpl.java

@@ -211,6 +211,7 @@ public class ContractSupplyServiceImpl  extends ServiceImpl<ContractSupplyMapper
         Map<String, Object> params = bo.getParams();
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ContractSupply> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<ContractSupply> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(ContractSupply::getId);
         lqw.orderByAsc(ContractSupply::getId);
+        lqw.eq(bo.getSupplierId() != null, ContractSupply::getSupplierId, bo.getSupplierId());
         lqw.eq(bo.getContractSupplyNo() != null, ContractSupply::getContractSupplyNo, bo.getContractSupplyNo());
         lqw.eq(bo.getContractSupplyNo() != null, ContractSupply::getContractSupplyNo, bo.getContractSupplyNo());
         lqw.eq(bo.getStartTime() != null, ContractSupply::getStartTime, bo.getStartTime());
         lqw.eq(bo.getStartTime() != null, ContractSupply::getStartTime, bo.getStartTime());
         lqw.eq(bo.getEndTime() != null, ContractSupply::getEndTime, bo.getEndTime());
         lqw.eq(bo.getEndTime() != null, ContractSupply::getEndTime, bo.getEndTime());

+ 24 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAddressServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.customer.service.impl;
 package org.dromara.customer.service.impl;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -20,6 +21,7 @@ import org.dromara.customer.domain.vo.SupplierAddressVo;
 import org.dromara.customer.domain.SupplierAddress;
 import org.dromara.customer.domain.SupplierAddress;
 import org.dromara.customer.mapper.SupplierAddressMapper;
 import org.dromara.customer.mapper.SupplierAddressMapper;
 import org.dromara.customer.service.ISupplierAddressService;
 import org.dromara.customer.service.ISupplierAddressService;
+import org.springframework.transaction.annotation.Transactional;
 
 
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -133,9 +135,20 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
      * @return 是否新增成功
      * @return 是否新增成功
      */
      */
     @Override
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(SupplierAddressBo bo) {
     public Boolean insertByBo(SupplierAddressBo bo) {
         SupplierAddress add = MapstructUtils.convert(bo, SupplierAddress.class);
         SupplierAddress add = MapstructUtils.convert(bo, SupplierAddress.class);
         validEntityBeforeSave(add);
         validEntityBeforeSave(add);
+        // 如果设置为自身地址
+        if ("1".equals(add.getIsSelf())) {
+
+            // 把该供应商下其他地址全部改为0
+            LambdaUpdateWrapper<SupplierAddress> updateWrapper = Wrappers.lambdaUpdate();
+            updateWrapper.eq(SupplierAddress::getSupplierId, add.getSupplierId())
+                .set(SupplierAddress::getIsSelf, "0");
+
+            baseMapper.update(null, updateWrapper);
+        }
         LambdaQueryWrapper<SupplierAddress> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<SupplierAddress> lqw = Wrappers.lambdaQuery();
         lqw.select(SupplierAddress::getAddressNo)
         lqw.select(SupplierAddress::getAddressNo)
             .orderByDesc(SupplierAddress::getAddressNo)
             .orderByDesc(SupplierAddress::getAddressNo)
@@ -159,9 +172,20 @@ public class SupplierAddressServiceImpl  extends ServiceImpl<SupplierAddressMapp
      * @return 是否修改成功
      * @return 是否修改成功
      */
      */
     @Override
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateByBo(SupplierAddressBo bo) {
     public Boolean updateByBo(SupplierAddressBo bo) {
         SupplierAddress update = MapstructUtils.convert(bo, SupplierAddress.class);
         SupplierAddress update = MapstructUtils.convert(bo, SupplierAddress.class);
         validEntityBeforeSave(update);
         validEntityBeforeSave(update);
+        // 如果本次修改设置为自身地址
+        if ("1".equals(update.getIsSelf())) {
+
+            LambdaUpdateWrapper<SupplierAddress> updateWrapper = Wrappers.lambdaUpdate();
+            updateWrapper.eq(SupplierAddress::getSupplierId, update.getSupplierId())
+                .ne(SupplierAddress::getId, update.getId()) // 排除自己
+                .set(SupplierAddress::getIsSelf, "0");
+
+            baseMapper.update(null, updateWrapper);
+        }
         return baseMapper.updateById(update) > 0;
         return baseMapper.updateById(update) > 0;
     }
     }
 
 

+ 18 - 19
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierAuthorizeServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
 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;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -91,10 +92,10 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
     public Boolean insertByBo(SupplierAuthorizeBo bo) {
     public Boolean insertByBo(SupplierAuthorizeBo bo) {
         // 1. 校验入参
         // 1. 校验入参
         if (bo.getCategoryIds() == null || bo.getCategoryIds().isEmpty()) {
         if (bo.getCategoryIds() == null || bo.getCategoryIds().isEmpty()) {
-            throw new RuntimeException("品类ID列表不能为空");
+            throw new ServiceException("品类ID列表不能为空");
         }
         }
         if (bo.getQualificationFiles() == null) {
         if (bo.getQualificationFiles() == null) {
-            throw new RuntimeException("资质文件不能为空");
+            throw new ServiceException("资质文件不能为空");
         }
         }
         Date endDate = bo.getQualificationFiles().stream()
         Date endDate = bo.getQualificationFiles().stream()
             .filter(file -> file.getEndTime() != null)
             .filter(file -> file.getEndTime() != null)
@@ -107,11 +108,11 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
         for (Long categoryId : categoryIds) {
         for (Long categoryId : categoryIds) {
             // 核心变更:从Redis生成唯一授权单号(替代数据库查询)
             // 核心变更:从Redis生成唯一授权单号(替代数据库查询)
             String authorizeNo =generateAuthorizeNo();
             String authorizeNo =generateAuthorizeNo();
-
             // 构建主表数据
             // 构建主表数据
             SupplierAuthorize save = new SupplierAuthorize();
             SupplierAuthorize save = new SupplierAuthorize();
             BeanUtils.copyProperties(bo, save);
             BeanUtils.copyProperties(bo, save);
             save.setAuthorizeNo(authorizeNo);
             save.setAuthorizeNo(authorizeNo);
+            save.setBrandRegistrant(bo.getBrandRegistrant());
             save.setCategoryId(categoryId);
             save.setCategoryId(categoryId);
             save.setAuthorizationEndTime(endDate);
             save.setAuthorizationEndTime(endDate);
             save.setAuthorizedStatus("0");
             save.setAuthorizedStatus("0");
@@ -569,7 +570,7 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
     }
     }
 
 
     @Override
     @Override
-    public List<SupplierAuthorizeVo> srmgetAuthorizeDetailList(SupplierAuthorizeBo  bo) {
+    public  TableDataInfo<SupplierAuthorizeVo> srmgetAuthorizeDetailList(SupplierAuthorizeBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<SupplierAuthorize> lqw = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<SupplierAuthorize> lqw = new LambdaQueryWrapper<>();
         lqw.eq(SupplierAuthorize::getSupplierId, bo.getSupplierId());
         lqw.eq(SupplierAuthorize::getSupplierId, bo.getSupplierId());
 
 
@@ -578,30 +579,28 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
             lqw.and(wrapper -> {
             lqw.and(wrapper -> {
                 // 1. 省份查询
                 // 1. 省份查询
                 if (ObjectUtil.isNotEmpty(bo.getProvince())) {
                 if (ObjectUtil.isNotEmpty(bo.getProvince())) {
-                    Long provinceId = remoteAddressAreaService.getIdsByName(bo.getProvince());
-                    if (provinceId != null) {
-                        wrapper.like(SupplierAuthorize::getAuthorizedArea, provinceId);
-                    }
+                    wrapper.apply("FIND_IN_SET({0}, authorized_area)", bo.getProvince());
                 }
                 }
                 // 2. 城市查询(和省份用AND关联,必须同时满足)
                 // 2. 城市查询(和省份用AND关联,必须同时满足)
                 if (ObjectUtil.isNotEmpty(bo.getCity())) {
                 if (ObjectUtil.isNotEmpty(bo.getCity())) {
-                    Long cityId = remoteAddressAreaService.getIdsByName(bo.getCity());
-                    if (cityId != null) {
-                        wrapper.like(SupplierAuthorize::getAuthorizedArea, cityId);
-                    }
+                    wrapper.apply("FIND_IN_SET({0}, authorized_area)", bo.getCity());
+                }
+                //3.品牌名称
+                if (ObjectUtil.isNotEmpty(bo.getBrandName())) {
+                    wrapper.eq(SupplierAuthorize::getBrandName,bo.getBrandName());
                 }
                 }
             });
             });
         }
         }
 
 
-
-        List<SupplierAuthorizeVo> supplierAuthorizeVos = baseMapper.selectVoList(lqw);
-        setSupplierNames(supplierAuthorizeVos);
+        Page<SupplierAuthorizeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<SupplierAuthorizeVo> records = result.getRecords();
+        setSupplierNames(records);
 
 
         // 使用AddressAreaService查询地区信息
         // 使用AddressAreaService查询地区信息
-        setSupplyAreaInfo(supplierAuthorizeVos);
+        setSupplyAreaInfo(records);
 
 
         //一级 二级 三级 品目
         //一级 二级 三级 品目
-        Map<Long,Long> categoryMap = supplierAuthorizeVos.stream()
+        Map<Long,Long> categoryMap = records.stream()
             .filter(item -> item.getId() != null && item.getCategoryId() != null)
             .filter(item -> item.getId() != null && item.getCategoryId() != null)
             .collect(Collectors.toMap(
             .collect(Collectors.toMap(
                 SupplierAuthorizeVo::getId,
                 SupplierAuthorizeVo::getId,
@@ -610,12 +609,12 @@ public class SupplierAuthorizeServiceImpl  extends ServiceImpl<SupplierAuthorize
 
 
         Map<Long, Map<String, String>> categorysMap = remoteCategoryService.getallCategoryNameById(categoryMap);
         Map<Long, Map<String, String>> categorysMap = remoteCategoryService.getallCategoryNameById(categoryMap);
 
 
-        supplierAuthorizeVos.forEach(item -> {
+        records.forEach(item -> {
             Map<String, String> stringStringMap = categorysMap.get(item.getId());
             Map<String, String> stringStringMap = categorysMap.get(item.getId());
             item.setCategorysMap(stringStringMap);
             item.setCategorysMap(stringStringMap);
         });
         });
 
 
-        return supplierAuthorizeVos;
+        return TableDataInfo.build(result);
     }
     }
 
 
     /**
     /**

+ 23 - 2
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java

@@ -2,6 +2,7 @@ package org.dromara.customer.service.impl;
 
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.digest.BCrypt;
 import cn.hutool.crypto.digest.BCrypt;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
@@ -149,6 +150,7 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
         LambdaQueryWrapper<SupplierContact> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<SupplierContact> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(SupplierContact::getId);
         lqw.orderByAsc(SupplierContact::getId);
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierContact::getSupplierNo, bo.getSupplierNo());
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierContact::getSupplierNo, bo.getSupplierNo());
+        lqw.eq(bo.getSupplierId() != null, SupplierContact::getSupplierId, bo.getSupplierId());
         lqw.like(StringUtils.isNotBlank(bo.getUserName()), SupplierContact::getUserName, bo.getUserName());
         lqw.like(StringUtils.isNotBlank(bo.getUserName()), SupplierContact::getUserName, bo.getUserName());
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SupplierContact::getPhone, bo.getPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SupplierContact::getPhone, bo.getPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SupplierContact::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SupplierContact::getStatus, bo.getStatus());
@@ -174,6 +176,15 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
 
 
         //4.如果是待修改审核  能登录  user是能登录的 status = 0
         //4.如果是待修改审核  能登录  user是能登录的 status = 0
         SupplierContact add = MapstructUtils.convert(bo, SupplierContact.class);
         SupplierContact add = MapstructUtils.convert(bo, SupplierContact.class);
+        // ====== 主联系人唯一控制 ======
+        if ("1".equals(add.getIsPrimaryContact())) {
+
+            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
+            updateWrapper.eq(SupplierContact::getSupplierId, add.getSupplierId())
+                .set(SupplierContact::getIsPrimaryContact, "0");
+
+            baseMapper.update(null, updateWrapper);
+        }
         RemoteUserBo remoteUserBo = new RemoteUserBo();
         RemoteUserBo remoteUserBo = new RemoteUserBo();
         remoteUserBo.setNickName(bo.getUserName());
         remoteUserBo.setNickName(bo.getUserName());
         remoteUserBo.setUserName(bo.getPhone());
         remoteUserBo.setUserName(bo.getPhone());
@@ -208,6 +219,16 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
     public Boolean updateByBo(SupplierContactBo bo) {
     public Boolean updateByBo(SupplierContactBo bo) {
         SupplierContact update = MapstructUtils.convert(bo, SupplierContact.class);
         SupplierContact update = MapstructUtils.convert(bo, SupplierContact.class);
+        // ====== 主联系人唯一控制 ======
+        if ("1".equals(update.getIsPrimaryContact())) {
+
+            LambdaUpdateWrapper<SupplierContact> updateWrapper = Wrappers.lambdaUpdate();
+            updateWrapper.eq(SupplierContact::getSupplierId, update.getSupplierId())
+                .ne(SupplierContact::getId, update.getId()) // 排除自己
+                .set(SupplierContact::getIsPrimaryContact, "0");
+
+            baseMapper.update(null, updateWrapper);
+        }
         if (update.getUserId() != null){
         if (update.getUserId() != null){
             RemoteUserBo remoteUserBo = new RemoteUserBo();
             RemoteUserBo remoteUserBo = new RemoteUserBo();
             remoteUserBo.setNickName(bo.getUserName());
             remoteUserBo.setNickName(bo.getUserName());
@@ -217,10 +238,10 @@ public class SupplierContactServiceImpl  extends ServiceImpl<SupplierContactMapp
             remoteUserBo.setPassword(BCrypt.hashpw(password));
             remoteUserBo.setPassword(BCrypt.hashpw(password));
             remoteUserBo.setUserSonType("1");
             remoteUserBo.setUserSonType("1");
             remoteUserBo.setTenantId(LoginHelper.getTenantId());
             remoteUserBo.setTenantId(LoginHelper.getTenantId());
-            remoteUserBo.setStatus(update.getIsRegister() == "0" ? "1" : "0");
+            remoteUserBo.setStatus("0".equals(update.getIsRegister()) ? "1" : "0");
             Long userId = remoteUserService.editUser(remoteUserBo);
             Long userId = remoteUserService.editUser(remoteUserBo);
         }
         }
-        update.setStatus(update.getIsRegister() == "0" ? "1" : "0");
+        update.setStatus("0".equals(update.getIsRegister()) ? "1" : "0");
         return baseMapper.updateById(update) > 0;
         return baseMapper.updateById(update) > 0;
     }
     }
 
 

+ 4 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContractServiceImpl.java

@@ -81,6 +81,9 @@ public class SupplierContractServiceImpl  extends ServiceImpl<SupplierContractMa
         if (bo.getSupplierId()!=null){
         if (bo.getSupplierId()!=null){
             supplierInfoWrapper.eq(SupplierInfo::getId, bo.getSupplierId());
             supplierInfoWrapper.eq(SupplierInfo::getId, bo.getSupplierId());
         }
         }
+        if (bo.getSupplierNo()!=null){
+            supplierInfoWrapper.eq(SupplierInfo::getSupplierNo, bo.getSupplierNo());
+        }
 
 
         // 添加其他SupplierInfo表的查询条件
         // 添加其他SupplierInfo表的查询条件
         supplierInfoWrapper.orderByDesc(SupplierInfo::getSupplierNo);
         supplierInfoWrapper.orderByDesc(SupplierInfo::getSupplierNo);
@@ -221,7 +224,7 @@ public class SupplierContractServiceImpl  extends ServiceImpl<SupplierContractMa
         LambdaQueryWrapper<SupplierContract> lqw = Wrappers.lambdaQuery();
         LambdaQueryWrapper<SupplierContract> lqw = Wrappers.lambdaQuery();
         lqw.orderByDesc(SupplierContract::getSupplierNo);
         lqw.orderByDesc(SupplierContract::getSupplierNo);
         lqw.like(StringUtils.isNotBlank(bo.getContractNo()), SupplierContract::getContractNo, bo.getContractNo());
         lqw.like(StringUtils.isNotBlank(bo.getContractNo()), SupplierContract::getContractNo, bo.getContractNo());
-        lqw.like(StringUtils.isNotBlank(bo.getContractName()), SupplierContract::getContractName, bo.getSupplierName());
+        lqw.like(StringUtils.isNotBlank(bo.getContractName()), SupplierContract::getContractName, bo.getContractName());
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierContract::getSupplierNo, bo.getSupplierNo());
         lqw.eq(StringUtils.isNotBlank(bo.getSupplierNo()), SupplierContract::getSupplierNo, bo.getSupplierNo());
         lqw.eq(bo.getContractStatus()!=null, SupplierContract::getContractStatus, bo.getContractStatus());
         lqw.eq(bo.getContractStatus()!=null, SupplierContract::getContractStatus, bo.getContractStatus());
         lqw.ge(bo.getContractStartTime() !=null, SupplierContract::getContractStartTime, bo.getContractStartTime());
         lqw.ge(bo.getContractStartTime() !=null, SupplierContract::getContractStartTime, bo.getContractStartTime());