From e08901517374121cd749c1c821be271f6a6eb2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E7=9A=87=E5=A4=A7=E5=8F=94?= Date: Mon, 13 Jul 2020 15:15:31 +0800 Subject: [PATCH] add work record --- .../yo-cms-web-0.0.1-SNAPSHOT.jar | Bin 1686082 -> 1686092 bytes .../cms/form/create/CreateFormSequence.java | 3 +- cms/src/main/resources/application.properties | 2 +- .../src/main/resources/application.properties | 4 +- .../templates/dialplan/agent-to-agent.xml | 2 +- .../templates/dialplan/campaign-to-agent.xml | 2 +- .../templates/dialplan/inbound-to-agent.xml | 2 +- .../templates/dialplan/local-extension.xml | 2 +- .../templates/dialplan/trunk-outbound.xml | 2 +- .../pudonghot/yo/mapper/WorkRecordMapper.java | 12 ++++ .../pudonghot/yo/mapper/WorkRecordMapper.xml | 11 ++++ .../yo/mapper/WorkRecordMapperTest.java | 25 ++++++++ .../src/test/resources/application.properties | 2 +- .../pudonghot/yo/model/domain/WorkRecord.java | 46 +++++++++++++++ .../yo/model/exception/ErrorCode.java | 4 ++ .../src/test/resources/application.properties | 2 +- .../src/test/resources/application.properties | 2 +- .../src/test/resources/application.properties | 2 +- .../controller/WorkRecordController.java | 55 ++++++++++++++++++ .../yo/openapi/request/ReqSaveWorkRecord.java | 46 +++++++++++++++ .../yo/openapi/service/WorkRecordService.java | 18 ++++++ .../service/impl/WorkRecordServiceImpl.java | 34 +++++++++++ .../src/main/resources/application.properties | 7 ++- .../com/pudonghot/yo/openapi/TestDriver.java | 11 ++++ .../yo/state/service/AgentService.java | 8 --- .../state/service/impl/AgentServiceImpl.java | 20 +------ .../src/main/resources/application.properties | 2 +- web/cms/app/services/sequence/service.js | 3 +- 28 files changed, 287 insertions(+), 42 deletions(-) create mode 100644 lib/mapper/src/main/java/com/pudonghot/yo/mapper/WorkRecordMapper.java create mode 100644 lib/mapper/src/main/java/com/pudonghot/yo/mapper/WorkRecordMapper.xml create mode 100644 lib/mapper/src/test/java/com/pudonghot/yo/mapper/WorkRecordMapperTest.java create mode 100644 lib/model/src/main/java/com/pudonghot/yo/model/domain/WorkRecord.java create mode 100644 openapi/src/main/java/com/pudonghot/yo/openapi/controller/WorkRecordController.java create mode 100644 openapi/src/main/java/com/pudonghot/yo/openapi/request/ReqSaveWorkRecord.java create mode 100644 openapi/src/main/java/com/pudonghot/yo/openapi/service/WorkRecordService.java create mode 100644 openapi/src/main/java/com/pudonghot/yo/openapi/service/impl/WorkRecordServiceImpl.java diff --git a/cms/local-repo/com/pudonghot/yo/yo-cms-web/0.0.1-SNAPSHOT/yo-cms-web-0.0.1-SNAPSHOT.jar b/cms/local-repo/com/pudonghot/yo/yo-cms-web/0.0.1-SNAPSHOT/yo-cms-web-0.0.1-SNAPSHOT.jar index e94b35e941fec06933d0df51d246fa0442c644b5..d3947aa39988c46b3d79d84f539ba4dc2ff606cc 100644 GIT binary patch delta 26329 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

3Q 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 diff --git a/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateFormSequence.java b/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateFormSequence.java index b32bb5cc..a68c2733 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateFormSequence.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateFormSequence.java @@ -20,7 +20,8 @@ public class CreateFormSequence extends BaseCreateForm { @Min(2) @Max(16) private int length; - @Min(1) + @Min(0) + @Max(999999999L) @NotNull private Long initVal; @Min(1) diff --git a/cms/src/main/resources/application.properties b/cms/src/main/resources/application.properties index 480bae2d..17622470 100644 --- a/cms/src/main/resources/application.properties +++ b/cms/src/main/resources/application.properties @@ -22,7 +22,7 @@ yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/fsagent/src/main/resources/application.properties b/fsagent/src/main/resources/application.properties index 7f304eb3..2b353432 100644 --- a/fsagent/src/main/resources/application.properties +++ b/fsagent/src/main/resources/application.properties @@ -15,13 +15,13 @@ yo.datasource.url=jdbc:mysql://172.18.4.35/yoqw?useUnicode=true&characterEncodin yo.datasource.username=yoqw yo.datasource.password=yoqw_query! -# Datasource +# Datasource FreeSWITCH yo.fs.datasource.url=jdbc:mysql://172.18.4.35/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/fsagent/src/main/resources/templates/dialplan/agent-to-agent.xml b/fsagent/src/main/resources/templates/dialplan/agent-to-agent.xml index e8d8ee2b..fd46fce9 100644 --- a/fsagent/src/main/resources/templates/dialplan/agent-to-agent.xml +++ b/fsagent/src/main/resources/templates/dialplan/agent-to-agent.xml @@ -26,7 +26,7 @@ - <#include "/dialplan/rec.xml"> + <#include "rec.xml"> - <#include "/dialplan/rec.xml"> + <#include "rec.xml"> - <#include "/dialplan/rec.xml"> + <#include "rec.xml"> diff --git a/fsagent/src/main/resources/templates/dialplan/local-extension.xml b/fsagent/src/main/resources/templates/dialplan/local-extension.xml index b95b10e0..dd6df574 100644 --- a/fsagent/src/main/resources/templates/dialplan/local-extension.xml +++ b/fsagent/src/main/resources/templates/dialplan/local-extension.xml @@ -26,7 +26,7 @@ - <#include "/dialplan/rec.xml"> + <#include "rec.xml"> - <#include "/dialplan/rec.xml"> + <#include "rec.xml"> + + diff --git a/lib/mapper/src/test/java/com/pudonghot/yo/mapper/WorkRecordMapperTest.java b/lib/mapper/src/test/java/com/pudonghot/yo/mapper/WorkRecordMapperTest.java new file mode 100644 index 00000000..0cf7ae5e --- /dev/null +++ b/lib/mapper/src/test/java/com/pudonghot/yo/mapper/WorkRecordMapperTest.java @@ -0,0 +1,25 @@ +package com.pudonghot.yo.mapper; + +import org.junit.Test; +import org.junit.runner.RunWith; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Donghuang + * @date Jul 13, 2020 10:22:12 + */ +@Slf4j +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath*:spring/spring-*.xml") +public class WorkRecordMapperTest { + @Autowired + private WorkRecordMapper mapper; + + @Test + public void testList() { + log.info("Result [{}].", mapper.list(null)); + } +} diff --git a/lib/mapper/src/test/resources/application.properties b/lib/mapper/src/test/resources/application.properties index 275a1367..174e4e8b 100644 --- a/lib/mapper/src/test/resources/application.properties +++ b/lib/mapper/src/test/resources/application.properties @@ -6,6 +6,6 @@ yo.datasource.username=yoqw yo.datasource.password=yoqw_query! # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/lib/model/src/main/java/com/pudonghot/yo/model/domain/WorkRecord.java b/lib/model/src/main/java/com/pudonghot/yo/model/domain/WorkRecord.java new file mode 100644 index 00000000..9f8b4c70 --- /dev/null +++ b/lib/model/src/main/java/com/pudonghot/yo/model/domain/WorkRecord.java @@ -0,0 +1,46 @@ +package com.pudonghot.yo.model.domain; + +import lombok.Getter; +import lombok.Setter; +import java.util.Date; +import com.wacai.tigon.mybatis.Table; +import com.wacai.tigon.mybatis.NotUpdate; +import lombok.experimental.FieldNameConstants; + +/** + * @author Donghuang + * @date Mar 09, 2020 16:11:08 + */ +@Getter +@Setter +@Table("br_work_record") +@FieldNameConstants(prefix = "") +public class WorkRecord extends TenantDomain { + @NotUpdate + private Integer agentId; + @NotUpdate + private String account; + private String connId; + private String takePhone; + private Date callStartTime; + private Date callEndTime; + /** + * hangup type, + * 01 -> Agent hangup + * 02 -> Customer hangup + */ + private String hangupType; + private PackType packType; + private String packRemark; + + public enum PackType { + /** + * business success + */ + Y, + /** + * business fail + */ + N + } +} diff --git a/lib/model/src/main/java/com/pudonghot/yo/model/exception/ErrorCode.java b/lib/model/src/main/java/com/pudonghot/yo/model/exception/ErrorCode.java index 6d392276..965bdfda 100644 --- a/lib/model/src/main/java/com/pudonghot/yo/model/exception/ErrorCode.java +++ b/lib/model/src/main/java/com/pudonghot/yo/model/exception/ErrorCode.java @@ -12,10 +12,14 @@ import lombok.RequiredArgsConstructor; public enum ErrorCode { NO_PERM("000-003", "没有权限调用接口"), + // 分机 DN_NOT_REGISTERED("001-001", "分机未注册"), DN_OFFLINE("001-002", "分机已掉线"), DN_IS_BUSY("001-003", "话机正忙"), + // 工作记录 + WORK_RECORD_PARAM_ACCOUNT_NOT_MATCH("004-001", "工号参数不匹配"), + SIGN_IN_PARAM_ERROR("100-001", "座席签入的时候,登录参数为空或者参数异常"), AGENT_SIGNED_IN("100-002", "坐席已签入"), INVALID_ACCOUNT_OR_PASSWORD("100-004", "座席签入使用的用户名或者密码错误"), diff --git a/lib/mybatis-cache/src/test/resources/application.properties b/lib/mybatis-cache/src/test/resources/application.properties index 2a1ee2e3..9545a549 100644 --- a/lib/mybatis-cache/src/test/resources/application.properties +++ b/lib/mybatis-cache/src/test/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=yo-mybatis-cache # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/lib/redis/raw/src/test/resources/application.properties b/lib/redis/raw/src/test/resources/application.properties index 5952de3c..8babc457 100644 --- a/lib/redis/raw/src/test/resources/application.properties +++ b/lib/redis/raw/src/test/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=yo-redis-raw # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 spring.redis.database=0 diff --git a/lib/service-common/src/test/resources/application.properties b/lib/service-common/src/test/resources/application.properties index cd4201ac..3ca9e05b 100644 --- a/lib/service-common/src/test/resources/application.properties +++ b/lib/service-common/src/test/resources/application.properties @@ -14,7 +14,7 @@ yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/openapi/src/main/java/com/pudonghot/yo/openapi/controller/WorkRecordController.java b/openapi/src/main/java/com/pudonghot/yo/openapi/controller/WorkRecordController.java new file mode 100644 index 00000000..ecddaaaf --- /dev/null +++ b/openapi/src/main/java/com/pudonghot/yo/openapi/controller/WorkRecordController.java @@ -0,0 +1,55 @@ +package com.pudonghot.yo.openapi.controller; + +import com.pudonghot.yo.model.domain.Agent; +import lombok.extern.slf4j.Slf4j; +import com.pudonghot.yo.model.domain.Tenant; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Controller; +import com.pudonghot.yo.model.exception.AssertUtils; +import com.pudonghot.yo.openapi.auth.SessionAbility; +import com.pudonghot.yo.openapi.service.AgentService; +import com.pudonghot.yo.openapi.request.ReqSaveWorkRecord; +import com.pudonghot.yo.openapi.service.WorkRecordService; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.beans.factory.annotation.Autowired; +import static com.pudonghot.yo.model.exception.ErrorCode.WORK_RECORD_PARAM_ACCOUNT_NOT_MATCH; + +/** + * @author Donghuang + * @date Jul 13, 2020 11:44:13 + */ +@Slf4j +@Controller +public class WorkRecordController implements SessionAbility { + @Autowired + private WorkRecordService workRecordService; + @Autowired + private AgentService agentService; + + @PostMapping("/resource/receive_agent_post/{account}") + public void save( + @PathVariable("account") + final String account, + @RequestBody + final ReqSaveWorkRecord body) { + + final Tenant tenant = getTenant(); + final Integer tenantId = tenant.getId(); + final Agent agent = agentService.findValid(tenantId, account); + final String bodyAccount = body.getAccount(); + if (StringUtils.isNotBlank(bodyAccount)) { + AssertUtils.state(account.equals(bodyAccount), WORK_RECORD_PARAM_ACCOUNT_NOT_MATCH); + } + else { + body.setAccount(account); + } + + body.setTenantId(tenantId); + body.setTenantCode(tenant.getCode()); + body.setAgentId(agent.getId()); + + workRecordService.create(body); + } +} diff --git a/openapi/src/main/java/com/pudonghot/yo/openapi/request/ReqSaveWorkRecord.java b/openapi/src/main/java/com/pudonghot/yo/openapi/request/ReqSaveWorkRecord.java new file mode 100644 index 00000000..cdcf518f --- /dev/null +++ b/openapi/src/main/java/com/pudonghot/yo/openapi/request/ReqSaveWorkRecord.java @@ -0,0 +1,46 @@ +package com.pudonghot.yo.openapi.request; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import java.util.Date; +import com.pudonghot.yo.model.domain.WorkRecord; +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +/** + * @author Donghuang + * @date Jul 02, 2020 11:54:30 + */ +@Getter +@Setter +@ToString +@JsonIgnoreProperties(ignoreUnknown = true) +public class ReqSaveWorkRecord { + @JsonIgnore + private Integer tenantId; + @JsonIgnore + private String tenantCode; + @JsonIgnore + private Integer agentId; + @JsonAlias("work_no") + private String account; + @JsonAlias("call_id") + private String connId; + @JsonAlias("cust_phone") + private String takePhone; + @JsonAlias("call_begin_date") + @JsonFormat(shape = JsonFormat.Shape.STRING, timezone = "Asia/Shanghai", pattern = "yyyy-MM-dd HH:mm:ss") + private Date callStartTime; + @JsonAlias("call_end_date") + @JsonFormat(shape = JsonFormat.Shape.STRING, timezone = "Asia/Shanghai", pattern = "yyyy-MM-dd HH:mm:ss") + private Date callEndTime; + @JsonAlias("hang_up_way") + private String hangupType; + @JsonAlias("pack_type") + private WorkRecord.PackType packType; + @JsonAlias("pack_remark") + private String packRemark; +} diff --git a/openapi/src/main/java/com/pudonghot/yo/openapi/service/WorkRecordService.java b/openapi/src/main/java/com/pudonghot/yo/openapi/service/WorkRecordService.java new file mode 100644 index 00000000..bf0dde10 --- /dev/null +++ b/openapi/src/main/java/com/pudonghot/yo/openapi/service/WorkRecordService.java @@ -0,0 +1,18 @@ +package com.pudonghot.yo.openapi.service; + +import com.wacai.tigon.service.BaseCrudService; +import com.pudonghot.yo.model.domain.WorkRecord; +import com.pudonghot.yo.openapi.request.ReqSaveWorkRecord; + +/** + * @author Donghuang + * @date Jul 13, 2020 10:24:57 + */ +public interface WorkRecordService extends BaseCrudService { + + /** + * create work record + * @param req + */ + void create(ReqSaveWorkRecord req); +} diff --git a/openapi/src/main/java/com/pudonghot/yo/openapi/service/impl/WorkRecordServiceImpl.java b/openapi/src/main/java/com/pudonghot/yo/openapi/service/impl/WorkRecordServiceImpl.java new file mode 100644 index 00000000..d9bc5728 --- /dev/null +++ b/openapi/src/main/java/com/pudonghot/yo/openapi/service/impl/WorkRecordServiceImpl.java @@ -0,0 +1,34 @@ +package com.pudonghot.yo.openapi.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import com.pudonghot.yo.mapper.WorkRecordMapper; +import com.pudonghot.yo.model.domain.WorkRecord; +import com.pudonghot.yo.openapi.request.ReqSaveWorkRecord; +import com.pudonghot.yo.openapi.service.WorkRecordService; +import com.wacai.tigon.service.support.BaseCrudServiceSupport; + +/** + * @author Donghuang + * @date Jul 13, 2020 10:25:41 + */ +@Slf4j +@Service +public class WorkRecordServiceImpl + extends BaseCrudServiceSupport + implements WorkRecordService { + + /** + * {@inheritDoc} + */ + @Override + public void create(final ReqSaveWorkRecord req) { + final WorkRecord workRecord = new WorkRecord(); + BeanUtils.copyProperties(req, workRecord); + workRecord.setCreatedBy(workRecord.getAccount()); + create(workRecord); + } +} diff --git a/openapi/src/main/resources/application.properties b/openapi/src/main/resources/application.properties index 03954c5c..0f8be7ab 100644 --- a/openapi/src/main/resources/application.properties +++ b/openapi/src/main/resources/application.properties @@ -15,8 +15,13 @@ yo.datasource.url=jdbc:mysql://172.18.4.35/yoqw?useUnicode=true&characterEncodin yo.datasource.username=yoqw yo.datasource.password=yoqw_query! +# Datasource FreeSWITCH +yo.fs.datasource.url=jdbc:mysql://172.18.4.35/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.username=freeswitch +yo.fs.datasource.password=RR!h5IpirsnJ + # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/openapi/src/test/java/com/pudonghot/yo/openapi/TestDriver.java b/openapi/src/test/java/com/pudonghot/yo/openapi/TestDriver.java index 0e79fddf..7a8f8740 100644 --- a/openapi/src/test/java/com/pudonghot/yo/openapi/TestDriver.java +++ b/openapi/src/test/java/com/pudonghot/yo/openapi/TestDriver.java @@ -2,7 +2,10 @@ package com.pudonghot.yo.openapi; import org.junit.Test; import java.util.UUID; +import java.io.IOException; import lombok.extern.slf4j.Slf4j; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.pudonghot.yo.openapi.request.ReqSaveWorkRecord; /** * @author Donghuang
@@ -18,4 +21,12 @@ public class TestDriver { + Long.toHexString(uuid.getLeastSignificantBits()); log.info("UUID: {}", id); } + + @Test + public void testDeserializeJson() throws IOException { + final ObjectMapper objectMapper = new ObjectMapper(); + final ReqSaveWorkRecord reqSaveWorkRecord = + objectMapper.readValue("{\"work_no\":\"8002\",\"call_id\":\"sas665448855-8878992544\",\"cust_phone\":\"13888888888\",\"pack_type\":\"Y\",\"pack_remark\":\"新快线外呼,营销成功\",\"call_begin_date\":\"2018-05-29 09:53:30\",\"call_end_date\":\"2018-05-29 09:53:59\",\"hang_up_way\":\"01\"}", ReqSaveWorkRecord.class); + log.info("Result [{}].", reqSaveWorkRecord); + } } diff --git a/state/src/main/java/com/pudonghot/yo/state/service/AgentService.java b/state/src/main/java/com/pudonghot/yo/state/service/AgentService.java index 1b9fa28f..c75aead5 100644 --- a/state/src/main/java/com/pudonghot/yo/state/service/AgentService.java +++ b/state/src/main/java/com/pudonghot/yo/state/service/AgentService.java @@ -8,12 +8,4 @@ import com.wacai.tigon.service.BaseCrudService; * Oct 26, 2019 15:59:44 */ public interface AgentService extends BaseCrudService { - - /** - * find valid agent - * @param tenantId tennat id - * @param account account - * @return agent - */ - Agent findValid(Integer tenantId, String account); } diff --git a/state/src/main/java/com/pudonghot/yo/state/service/impl/AgentServiceImpl.java b/state/src/main/java/com/pudonghot/yo/state/service/impl/AgentServiceImpl.java index 99e75938..21d4677a 100644 --- a/state/src/main/java/com/pudonghot/yo/state/service/impl/AgentServiceImpl.java +++ b/state/src/main/java/com/pudonghot/yo/state/service/impl/AgentServiceImpl.java @@ -1,12 +1,9 @@ package com.pudonghot.yo.state.service.impl; -import com.pudonghot.yo.model.exception.AssertUtils; -import com.pudonghot.yo.model.exception.ErrorCode; -import com.pudonghot.yo.state.service.AgentService; -import com.wacai.tigon.mybatis.Search; -import org.springframework.stereotype.Service; import com.pudonghot.yo.mapper.AgentMapper; import com.pudonghot.yo.model.domain.Agent; +import org.springframework.stereotype.Service; +import com.pudonghot.yo.state.service.AgentService; import com.wacai.tigon.service.support.BaseCrudServiceSupport; /** @@ -17,17 +14,4 @@ import com.wacai.tigon.service.support.BaseCrudServiceSupport; public class AgentServiceImpl extends BaseCrudServiceSupport implements AgentService { - - /** - * {@inheritDoc} - */ - @Override - public Agent findValid(final Integer tenantId, final String account) { - final Agent agent = find( - new Search(Agent.TENANT_ID, tenantId) - .eq(Agent.ACCOUNT, account)); - AssertUtils.state(agent != null, ErrorCode.AGENT_NOT_FOUND); - AssertUtils.state(agent.getActive(), ErrorCode.AGENT_DISABLED); - return agent; - } } diff --git a/state/src/main/resources/application.properties b/state/src/main/resources/application.properties index 6dc1d05d..5caad1a8 100644 --- a/state/src/main/resources/application.properties +++ b/state/src/main/resources/application.properties @@ -10,7 +10,7 @@ yo.datasource.username=yoqw yo.datasource.password=yoqw_query! # Redis -spring.redis.host=172.16.92.232 +spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 diff --git a/web/cms/app/services/sequence/service.js b/web/cms/app/services/sequence/service.js index 85dd5b71..c9ad71db 100644 --- a/web/cms/app/services/sequence/service.js +++ b/web/cms/app/services/sequence/service.js @@ -22,7 +22,8 @@ export default Service.extend({ presence: true, numericality: { onlyInteger: true, - greaterThan: 1 + greaterThanOrEqualTo: 0, + lessThanOrEqualTo: 999999999 } }, step: {