Explorar o código

Merge branch 'master' of https://gogs.storlead.com/storlead/storlead-sasa-platform

183207892172 hai 1 mes
pai
achega
47713e16df

+ 9 - 4
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/service/impl/MarketingCampaignServiceImpl.java

@@ -173,6 +173,10 @@ public class MarketingCampaignServiceImpl
     public Result<Object> addMarket(MarketingCampaignDTO marketingCampaignDTO) {
         MarketingCampaignEntity marketingCampaignEntity = new MarketingCampaignEntity();
         BeanUtils.copyProperties(marketingCampaignDTO, marketingCampaignEntity);
+        // 过滤 AI 最优时间占位值,避免写入 DATETIME 列报错
+        if ("optimal".equalsIgnoreCase(marketingCampaignEntity.getEmailSentTime())) {
+            marketingCampaignEntity.setEmailSentTime(null);
+        }
         boolean isOk = this.save(marketingCampaignEntity);
         if (!isOk) {
 
@@ -217,12 +221,9 @@ public class MarketingCampaignServiceImpl
                 }
                 boolean saveOk = marketingCampaignSopDetailService.saveBatch(marketingCampaignSopDetailEntityList);
 
-
-                //生成每个客户的邮件发送时间
+                //异步生成每个客户的邮件发送时间
                 marketEmailsService.addSendTime(marketingCampaignEntity);
 
-
-
         }
         return Result.ok();
     }
@@ -236,6 +237,10 @@ public class MarketingCampaignServiceImpl
         MarketingCampaignEntity marketingCampaignOld = this.getById(marketingCampaignDTO.getId());
         MarketingCampaignEntity marketingCampaignEntity = new MarketingCampaignEntity();
         BeanUtils.copyProperties(marketingCampaignDTO, marketingCampaignEntity);
+        // 过滤 AI 最优时间占位值,避免写入 DATETIME 列报错
+        if ("optimal".equalsIgnoreCase(marketingCampaignEntity.getEmailSentTime())) {
+            marketingCampaignEntity.setEmailSentTime(null);
+        }
         boolean isOk = this.updateById(marketingCampaignEntity);
         if (!isOk) {
             return Result.error("修改失败");

+ 0 - 3
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/service/impl/MarketingCampaignSopDetailServiceImpl.java

@@ -113,9 +113,6 @@ public class MarketingCampaignSopDetailServiceImpl
                 if ("yourEmail".equals(sysDictDetailResponseDTO.getLabel())) {
                     yourEmail = sysDictDetailResponseDTO.getValue();
                 }
-                if ("本地信息".equals(sysDictDetailResponseDTO.getLabel())) {
-                    yourName = sysDictDetailResponseDTO.getValue();
-                }
                 if ("fullCompanyAddress".equals(sysDictDetailResponseDTO.getLabel())) {
                     fullCompanyAddress = sysDictDetailResponseDTO.getValue();
                 }

+ 6 - 2
ui/smarttrade-platform/src/api/knowledge/index.js

@@ -45,8 +45,12 @@ export const delDocuments = (params = {}) => {
 }
 
 export const createChunk = (data = {}) => {
-    const { dataset_id,document_id, ...query } = data
-    return post(`/router/rest/knowledge/chunk/${dataset_id}/${document_id}`, data)
+    const { dataset_id, document_id, ...segmentItem } = data
+    // 请求体外层包 segments 数组
+    const body = {
+        segments: [segmentItem]
+    }
+    return post(`/router/rest/knowledge/chunk/${dataset_id}/${document_id}`, body)
 }
 
 export const delChunk = (params = {}) => {

+ 15 - 9
ui/smarttrade-platform/src/components/addMarketing.vue

@@ -82,9 +82,9 @@
                             <label class="form-label">开始日期</label>
                             <el-date-picker
                                 v-model="newCampaign.startDate"
-                                type="datetime"
-                                format="YYYY-MM-DD HH:mm"
-                                value-format="YYYY-MM-DD HH:mm"
+                                type="date"
+                                format="YYYY-MM-DD"
+                                value-format="YYYY-MM-DD"
                                 placeholder="选择开始时间"
                             />
                         </div>
@@ -92,9 +92,9 @@
                             <label class="form-label">结束日期</label>
                             <el-date-picker
                                 v-model="newCampaign.endDate"
-                                type="datetime"
-                                format="YYYY-MM-DD HH:mm"
-                                value-format="YYYY-MM-DD HH:mm"
+                                type="date"
+                                format="YYYY-MM-DD"
+                                value-format="YYYY-MM-DD"
                                 placeholder="选择结束时间"
                             />
                         </div>
@@ -107,7 +107,7 @@
                                 <el-option label="李主管" value="sales2" />
                                 <el-option label="王小明" value="sales3" />
                             </el-select> -->
-                            <SelectUser v-model="newCampaign.owner" multiple />
+                            <SelectUser v-model="newCampaign.owner" multiple @onOk="handleSelectUser" />
                         </div>
                     </div>
                     <div class="form-group">
@@ -525,7 +525,7 @@
                                 <div class="preview-info">
                                     <div class="preview-label">负责人</div>
                                     <div class="preview-value">
-                                        {{ getOwnerName(newCampaign.owner) || "未指定" }}
+                                        {{ getOwnerName() }}
                                     </div>
                                 </div>
                             </div>
@@ -859,10 +859,15 @@
         customerDetailRef.value.open(type, customerList.value)
     }
 
+    const selectedUser = ref([])
+    const handleSelectUser = (users) => {
+        selectedUser.value = users
+    }
+
     const sopTemplates = ref([])
     const getTypeLabel = (type) => ({ prospect: '潜客开发', nurture: '客户培育', reactivate: '客户唤醒', promote: '产品推广', seasonal: '节日营销', exhibition: '展会跟进', other: '其他' }[type] || type)
     const getPriorityLabel = (priority) => ({ urgent: '紧急', high: '高优先', medium: '中等', low: '低优先' }[priority] || priority)
-    const getOwnerName = (owner) => ({ sales1: '张经理', sales2: '李主管', sales3: '王小明' }[owner] || '')
+    const getOwnerName = () => { return selectedUser.value.map(item => item.realName).join(',') }
     const getChannelStyle = (id) => {
         const styles = {
             email: { background: 'rgba(99, 102, 241, 0.2)', color: 'var(--primary)' },
@@ -1111,6 +1116,7 @@
         getEmails()
         let userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
         newCampaign.value.owner = [userInfo.id]
+        selectedUser.value = [{ id: userInfo.id, realName: userInfo.realName }]
     }
 
     const regionValue = ref([])

+ 2 - 2
ui/smarttrade-platform/src/components/marketing/marketingDetail.vue

@@ -199,12 +199,12 @@
           </div>
         </div>
         <div class="modal-footer">
-          <button class="btn btn-secondary" @click="duplicateCampaign(selectedCampaign)">
+          <!-- <button class="btn btn-secondary" @click="duplicateCampaign(selectedCampaign)">
             <i class="fas fa-copy"></i> 复制活动
           </button>
           <button class="btn btn-secondary" @click="exportCampaignReport(selectedCampaign)">
             <i class="fas fa-download"></i> 导出报告
-          </button>
+          </button> -->
           <button class="btn btn-secondary" @click="showCampaignDetailModal = false">关闭</button>
           <button class="btn btn-primary" @click="editCampaign(selectedCampaign)">
             <i class="fas fa-edit"></i> 编辑活动

+ 8 - 6
ui/smarttrade-platform/src/views/KnowledgeView.vue

@@ -527,7 +527,7 @@
           <button class="modal-close" @click="showDetailModal = false"><i class="fas fa-times"></i></button>
         </div>
         <div class="modal-body">
-          <div class="detail-section">
+          <div class="detail-section"  v-if="doc_form=='qa_model'">
             <div class="detail-label"><i class="fas fa-lightbulb"></i> 答案内容</div>
             <div class="detail-content">{{ selectedKnowledge.answer }}</div>
           </div>
@@ -851,14 +851,15 @@ const getCategoryList  = (id,type) => {
     documentsParams.value.keyword = searchQuery.value
     documentsParams.value.pageSize = 10
   }else{
+    documentsParams.value.dataset_id = id?id:''
     documentsParams.value.pageSize = 9999
   }
   getAllDocumnets(documentsParams.value).then(res => {
-    console.log(res)
     if(type=='add'){ //添加知识获取分类
       documentList.value = res.result.data
     }else{
       knowledgeList.value = res.result.data
+      
       tabs.value[1].count = categoryTotal.value = res.result.total
     }
   })
@@ -899,10 +900,11 @@ const getChunkDatasets = () => {
     const apiFn = chunkParams.value.document_id ? getChunks : getAllChunks
     apiFn(chunkParams.value).then(res => {
       chunkLoading.value = false
-      chunkList.value = res.result.data
       res.result.data.forEach(el => {
         el.timeip = formatTimeAgo(el.updated_at)
+        el.dataset_id = chunkParams.value.dataset_id
       });
+      chunkList.value = res.result.data
       chunksTotal.value =  res.result.total
       doc_form.value = res.result.doc_form
     })
@@ -1083,7 +1085,6 @@ const detailDocument = (item) => {
     document_id:item.id,
   }
    getDocumentDetail(params).then(res => {
-    console.log(555)
   })
 }
 
@@ -1099,6 +1100,7 @@ const addKnowledgeDocument = ()=> {
   newKnowledge.value.segment_id=''
   chunkType.value = 'add'
   showAddModal.value = true
+  documentList.value = []
 }
 const addKnowledge = () => {
   if(!newKnowledge.value.answer||!newKnowledge.value.content||!newKnowledge.value.dataset_id||!newKnowledge.value.document_id){
@@ -1108,14 +1110,14 @@ const addKnowledge = () => {
   if(chunkType.value =='add'){
     createChunk(newKnowledge.value).then(res => {
       if(res.success){
-        howToastMessage('知识添加成功,AI 已学习', 'success')
+        showToastMessage('知识添加成功,AI 已学习', 'success')
         showAddModal.value = false
       }
     })
   }else{
     editChunk(newKnowledge.value).then(res => {
       if(res.success){
-        howToastMessage('知识编辑成功,AI 已学习', 'success')
+        showToastMessage('知识编辑成功,AI 已学习', 'success')
         showAddModal.value = false
       }
     })