CrazyIter_Bin 1 rok temu
rodzic
commit
1081a571e1

+ 38 - 42
TEAMModelBI/ClientApp/src/view/created/created.vue

@@ -108,9 +108,6 @@
             <el-form-item :label="$t(`areaManages.createdArea.areaSelect`)" class="region">
               <el-cascader v-model="provinceOptions.provinceValue" :options="provinceOptions.optionInfo" :props="regionParams" placeholder="选择学区所在地" @change="cascaderArea" />
             </el-form-item>
-            <el-form-item label="频道简码" class="special">
-              <el-input v-model="formArea.shortCode" placeholder="填写学区跳转苏格拉底频道简码" />
-            </el-form-item>
           </el-form>
           <div class="submitbtn">
             <el-button type="primary" @click="createdArea()" :loading="createdLoading">
@@ -195,10 +192,10 @@
               <el-checkbox label="大学"></el-checkbox> -->
               </el-radio-group>
             </el-form-item>
-            <!-- <el-form-item label="创校流程" class="school-form-grading">
+            <el-form-item label="创校流程" class="school-form-grading">
               <el-radio v-model="item.modules" label="default" size="large">普通创校</el-radio>
               <el-radio v-model="item.modules" label="art" size="large">评测创校</el-radio>
-            </el-form-item> -->
+            </el-form-item>
             <el-form-item label="预设管理员" class="scholl-admin" prop="presupposeAdmin">
               <el-input v-model="item.presupposeAdmin" placeholder="输入醍摩豆账号或手机号,预设学校管理员" />
               <p class="repetition-hint" v-if="repetition.admin">该管理员用户不存在,请检查</p>
@@ -255,11 +252,14 @@
                 <p class="repetition-hint" v-if="repetition.code">该学校简码已存在,请检查学校信息</p>
               </template>
             </el-form-item>
+            <el-form-item label="規模版本" class="school-detailedly">
+              <el-input v-model="item.scaleVersion" placeholder="規模版本" />
+            </el-form-item>
           </el-form>
           <div class="confirmarea">
             <el-button type="primary" @click="verifyBase()" v-if="verifyForstate.state ===false">数据核验</el-button>
             <el-button type="success" @click="createdSchool()" :loading="createdSchoolLoading" v-else-if="verifyForstate.state===true && verifyForstate.pass===true ">{{ $t(`schoolManages.createSchools.submit`) }}</el-button>
-            <!-- <el-button @click="closeandreturn('close', 'school')">重置</el-button> -->
+            <!-- <el-button @click="closeandreturn('close', 'school')">重置</el-button> -->            
             <el-button @click="resetForm()">重置</el-button>
           </div>
         </div>
@@ -331,7 +331,7 @@
             <div class="confirmarea virtualsubmitbtn">
               <el-button type="primary" v-if="verifyForstate.state ===false">数据核验</el-button>
               <el-button type="success" @click="createdSchool()" :loading="createdSchoolLoading" v-else-if="verifyForstate.state===true && verifyForstate.pass===true ">{{ $t(`schoolManages.createSchools.submit`) }}</el-button>
-              <!-- <el-button @click="closeandreturn('close', 'school')">重置</el-button> -->
+              <!-- <el-button @click="closeandreturn('close', 'school')">重置</el-button> -->              
               <el-button @click="resetForm()">重置</el-button>
             </div>
           </el-form>
@@ -574,7 +574,7 @@ import * as excel from '../../until/excel.js'
 import option from '@/static/region.json'
 import router from '@/router/index.js'
 import { useRoute } from 'vue-router'
-import { useI18n } from 'vue-i18n'
+ import { useI18n } from 'vue-i18n'
 import option_cn from '@/static/regions/region_cn.json'
 import option_gl from '@/static/regions/region_gl.json'
 const chinaData = new EluiChinaAreaDht.ChinaArea().chinaAreaflat
@@ -595,7 +595,6 @@ const areaData = {
   capacityvalue: '',
   options: [],
   areaAdmin: '',
-  shortCode:'',
 }
 const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
 const optionsData = siteValue === 'cn' ? option_cn : option_gl
@@ -624,7 +623,7 @@ const schoolAssets = {
   address: '',
   areaId: '',
   lang: "1",
-  // modules:'default',
+  modules:'default',
   schoolLocation: {
     region: '',
     regionvalue: '',
@@ -651,7 +650,7 @@ export default {
   components: { EluiChinaAreaDht, Search, StarFilled },
   setup () {
     const siteValue = window.location.host === 'localhost:5001' ? 'cn' : window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
-    const { t } = useI18n()
+     const { t } = useI18n()
     const labelPosition = 'right'
     let { proxy } = getCurrentInstance()
     const store = useStore()
@@ -977,11 +976,6 @@ export default {
         ElMessage.error('请完善学区名称后,再进行创区操作')
         return
       }
-      if(formArea.value.shortCode.length !==6){
-        ElMessage.error('频道简码需6位字母或数字,请重新填写')
-        formArea.value.shortCode=''
-        return
-      }
       createdLoading.value = true
       loadingCreatedArea.value = true;
       //获取最后一位的名字,生成名字
@@ -1018,7 +1012,6 @@ export default {
         areaAdmin: formArea.value.areaAdmin,
         tmdId: users.tmdId,
         tmdName: users.tmdName,
-        shortCode:formArea.value.shortCode
       }
       console.log(createdParame, '创区数据')
       if (createdParame.institution === '' || createdParame.institution === undefined) {
@@ -1069,6 +1062,7 @@ export default {
     }
     //创建学校
     function createdSchool () {
+      //debugger;
       console.log(schoolForm, '创校数据')
       let langState = (schoolForm.value[0].lang === "1" || schoolForm.value[0].lang === "2" || schoolForm.value[0].lang === "3") ? true : false
       if (schoolForm.value[0].name === '' || schoolForm.value[0].name === undefined) {
@@ -1136,9 +1130,10 @@ export default {
           lang: schoolForm.value[0].lang === '1' ? 'zh-CN' : schoolForm.value[0].lang === '2' ? 'zh-TW' : schoolForm.value[0].lang === '3' ? 'en-US' : 'zh-CN',
           areaId: schoolForm.value[i].areaIdcreated,
           code: schoolForm.value[i].code,
-          // modules:schoolForm.value[i].modules === 'default' ? []:['art']
+          modules:schoolForm.value[i].modules === 'default' ? []:['art'],
+          scaleVersion:schoolForm.value[i].scaleVersion
         })
-      }
+      }      
       let parameter = { biSchools: datas, lang: schoolForm.value[0].lang === '1' ? 'zh-CN' : schoolForm.value[0].lang === '2' ? 'zh-TW' : schoolForm.value[0].lang === '3' ? 'en-US' : 'zh-CN' }
       console.log(schoolForm.value[0].lang)
       console.log(parameter, '创建学校最后的数据格式')
@@ -1174,7 +1169,7 @@ export default {
       schoolForm.value[0].lang = "1"
       schoolForm.value[0].areaIdcreated = ''
       schoolForm.value[0].code = ''
-      // schoolForm.value[0].modules  = 'default'
+      schoolForm.value[0].modules  = 'default'
       provinceOptions.value.provinceValue = ''
     }
     //处理取消和确认并返回
@@ -1348,7 +1343,6 @@ export default {
       console.log(data, '提交的数据')
       proxy.$api.verifyContent(data).then((res) => {
         console.log(res, '数据验证的结果')
-        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 200) {
           //处理简码
           res.createScInfo.forEach((items) => {
@@ -1359,6 +1353,7 @@ export default {
             }
           })
         }
+        res.state === 200 ? (batchDatas.forEach((item) => { item.dataState = true }), batchVerify(presentData, loadingverify), codeShow.value = true) : ''
         if (res.state === 201) {
           codeShow.value = false
           batchTablesArr.value = true; verifyState.value = false
@@ -1690,7 +1685,7 @@ export default {
           ElMessage({ showClose: false, message: '数据存在异常,请检查表单内容', type: 'error', duration: 4000 })
         }
         verifySchool.close()
-      }).catch((error) => {
+      }).catch((error) => {        
         ElMessage.error('API异常,数据核验失败')
         verifySchool.close()
       })
@@ -1742,11 +1737,11 @@ export default {
         })
       }
 
-      let datas = { regionId: regionCodeNow, name: verifyData[0].name, nameFuzzy: false, shortCode: verifyData[0].code, shortCodeFuzzy: false }
+      let datas = { regionId: '', name: '', nameFuzzy: false, shortCode: '', shortCodeFuzzy: false, codeOrShortCode: verifyData[0].code }
       proxy.$api.verifyDatainbb(datas).then((res) => {
         console.log(res.length, '核验数据')
-        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,请检查表单内容'))
-      }).catch((error) => {
+        res.length == 0 ? (verifyForstate.value.state = true, verifyForstate.value.pass = true, ElMessage.success('数据已通过核验,可执行创校')) : (verifyForstate.value.state = false, verifyForstate.value.pass = false, ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码。'))
+      }).catch((error) => {        
         ElMessage.error('API异常,数据核验失败')
       })
       console.log(verifyData, '准备核验的数据')
@@ -1757,25 +1752,25 @@ export default {
       let scArr = value
       let snameList = []; let scodeList = []; let shortArr = []; let regionList = []; let regionInfoRowNow = [];
       let regionCodeTmp = ''
-      scArr.forEach((item) => {
-        snameList.push(item.name);
-        scodeList.push(item.id);
+        scArr.forEach((item) => {
+        // snameList.push(item.name);
+        // scodeList.push(item.id);
         shortArr.push(item.id);
-        regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
-        regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
-        if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
-          regionList.push(regionCodeTmp)
-        }
+        // regionInfoRowNow = regionInfoList.filter(function (rgitem) { return rgitem.name.includes(item.region) })
+        // regionCodeTmp = (regionInfoRowNow.length > 0 && regionInfoRowNow[0].hasOwnProperty('code')) ? regionInfoRowNow[0]['code'] : ''
+        // if (regionCodeTmp != '' && !regionList.includes(regionCodeTmp)) {
+        //   regionList.push(regionCodeTmp)
+        // }
       })
-      let data = { nameList: snameList, codeList: scodeList, shortCodeList: shortArr }
-      if (siteValue === 'cn') {
-        data['regionId'] = 'CN'
-      } else {
-        data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
-        data['regionIdList'] = (regionList.length > 1) ? regionList : []
-      }
+      let data = { nameList: snameList, codeList: scodeList, codeOrShortCodeList: shortArr }
+      // if (siteValue === 'cn') {
+      //   data['regionId'] = 'CN'
+      // } else {
+      //   data['regionId'] = (regionList.length == 1) ? regionList[0] : ''
+      //   data['regionIdList'] = (regionList.length > 1) ? regionList : []
+      // }
       proxy.$api.verifyDatainbb(data).then((res) => {
-        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
+        res.length == 0 ? (ElMessage.success('数据已通过核验,可执行创校'), batchTablesArr.value = true) : (ElMessage.error('数据未通过核验,BB学校资料库已存在此学校代码或简码,请检查表单内容'), batchTablesArr.value = true, verifyState.value = false)
       }).catch((error) => {
         ElMessage.error('API异常,批量数据核验失败')
       })
@@ -2043,7 +2038,8 @@ export default {
       timer,
       selectSchoolstate,
       selectModels,
-      virtualSchoolform
+      virtualSchoolform,
+      
     }
   },
 }

+ 2 - 1
TEAMModelBI/ClientApp/src/view/ddlogin.vue

@@ -10,7 +10,8 @@ const hosts = window.location.host === 'localhost:5001' ? 'localhost:5001' :
         window.location.host === 'bi.teammodel.net' ? 'bi.teammodel.net' :
             window.location.host === 'bi-rc.teammodel.net' ? 'bi-rc.teammodel.net' :
                 'bitest.teammodel.cn'
-const appsKey = window.location.host === 'localhost:5001' || window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
+    const appsKey = window.location.host === 'localhost:5001' || window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
+    //const appsKey =  window.location.host === 'bi.teammodel.cn' || window.location.host === 'bitest.teammodel.cn' ? 'dingrucgsnt8p13rfbgd' : 'dingupjxyj1guhh5p8dt'
 console.log(appsKey, 'key的内容')
 import axios from 'axios'
 export default {

+ 88 - 10
TEAMModelBI/ClientApp/src/view/schoolServe/school.vue

@@ -286,6 +286,9 @@
                   <el-button size="small" @click="nowPitchdata.size =500" disabled v-else>500</el-button>
                 </div>
               </el-form-item>
+              <el-form-item label="規模版本" class="school-form-name">
+                <el-input v-model="nowPitchdata.scaleVersion" placeholder="编辑規模版本"></el-input>
+              </el-form-item>
               <!-- <el-form-item label="学校状态:" class="school-form-state">
                     <el-switch v-model="value2" active-color="#13ce66" inactive-color="#ff4949" />
                 </el-form-item> -->
@@ -294,6 +297,7 @@
                   {{ $t(`schoolManages.basicSet.submit`) }}</el-button>
                 <!-- <el-button @click="schoolClose">{{ $t(`commonMsg.closes`) }}</el-button> -->
               </el-form-item>
+              
             </el-form>
           </div>
         </div>
@@ -416,6 +420,7 @@ export default {
       admin: '',
       type: 0,
       scale: 0,
+      edition:{}
     })
     let originalData = ref([])
     let originalNum = ref(0)
@@ -560,9 +565,12 @@ export default {
         // sortable: true,
          cellRenderer: (data) => (
           <>
+            <div style="color:#000000;" v-show={data.rowData.versions !=='基础版' && data.rowData.versions !=='标准版' && data.rowData.versions !=='专业版'}>{data.rowData.versions}</div>
             <div style="color:#e6a23c;" v-show={data.rowData.versions ==='专业版' ? true:false}>专业版</div>
             <div style="color:#67C23A;" v-show={data.rowData.versions ==='标准版' ? true:false}>标准版</div>
             <div style="color:#409EFF;" v-show={data.rowData.versions ==='基础版' ? true:false}>基础版</div>
+            
+            
           </>
         ),
       },
@@ -691,7 +699,8 @@ export default {
     const shouldFilter = ref({
       major: true,
       standard: true,
-      basics: true
+      basics: true,
+      custom: true
     })
     const popoverRef = ref()
     columns[3].headerCellRenderer = (props = HeaderCellSlotProps) => {
@@ -719,6 +728,9 @@ export default {
                     <ElCheckbox v-model={shouldFilter.value.basics} onChange={versionsEstimate}>
                       基础版
                     </ElCheckbox>
+                    <ElCheckbox v-model={shouldFilter.value.custom} onChange={versionsEstimate}>
+                      自訂版
+                    </ElCheckbox>
                   </div>
                   {/* <div class="el-table-v2__demo-filter">
                     <ElButton size="small">
@@ -785,7 +797,20 @@ export default {
         console.log(areaSelect, '当时的学区数据')
         res.state == 200 ? 
         (tableData.value = [], originalData.value = [], 
-        res.scInfos.forEach((item)=>{item.versions= item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版':item.service.includes('YMPCVCIM') ? '标准版':'基础版'}),
+        res.scInfos.forEach((item)=>{
+         // debugger;
+          //item.versions= item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版':item.service.includes('YMPCVCIM') ? '标准版':'基础版'}),
+          if (item.edition !== null) {
+                if (item.edition.scaleVersion !== null && item.edition.scaleVersion !== "") {
+                  item.versions = item.edition.scaleVersion;
+                } else {
+                  item.versions = item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版' : item.service.includes('YMPCVCIM') ? '标准版' : '基础版';
+                }
+              } else {
+                item.versions = item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? '专业版' : item.service.includes('YMPCVCIM') ? '标准版' : '基础版';
+              }
+          
+          }),
         tableData.value.push(...res.scInfos),originalNum.value = res.scInfos.length,
         originalData.value = res.scInfos,tablesccnt.value = res.allCnt) 
         : ''
@@ -800,6 +825,7 @@ export default {
     }
     //点击学校列表,详情
     function deleteRow (data, index) {
+      //debugger;
       console.log(index, 'INDEX')
       console.log(data, 'DATA')
       //处理的基础设置
@@ -813,6 +839,17 @@ export default {
       nowPitchdata.value.scale = data.scale
       nowPitchdata.value.standard = data.standard
       nowPitchdata.value.areaId = data.areaId
+      if (data.edition !== null) {
+        if (data.edition.scaleVersion !== null) {
+          nowPitchdata.value.scaleVersion = data.edition.scaleVersion;
+        } else {
+          nowPitchdata.value.scaleVersion = "";
+        }
+
+      } else {
+        nowPitchdata.value.scaleVersion = "";
+      }
+      
       nSchool.value.img = data.picture
       nSchool.value.name = data.name
       data.assists.length ? data.assists.forEach((element) => { adminvalue.value.push(element.id) }) : ''
@@ -1124,7 +1161,7 @@ export default {
           }
         }
       }
-      console.log(placeArr)
+      console.log(placeArr);
       //去重管家列表
       // assisArr.forEach((item) => {
       //   let ids = item.id
@@ -1132,7 +1169,9 @@ export default {
       //     assisArr[i].id === ids ? assisArr.splice(i, 1) : ''
       //   }
       // })
-      console.log(areaSelect.Selectvalue, nowPitchdata.value.areaId, '预计要更改和本来的')
+      
+      console.log(areaSelect.Selectvalue, nowPitchdata.value.areaId, '预计要更改和本来的');
+      
       let updateForm = {
         name: nowPitchdata.value.name,
         schoolId: nowPitchdata.value.id,
@@ -1147,7 +1186,8 @@ export default {
         city: placeArr[1],
         dist: placeArr[2],
         address: nowPitchdata.value.address,
-        modules:nowPitchdata.value.modules ==='default' ? [] :['art']
+        modules:nowPitchdata.value.modules ==='default' ? [] :['art'],
+        scaleVersion: nowPitchdata.value.scaleVersion
       }
       console.log(updateForm, '修改学校信息')
       console.log(nowPitchdata.value, '原本的学校信息')
@@ -1467,11 +1507,49 @@ export default {
     function versionsEstimate (val) {
       console.log(shouldFilter.value)
       let arrState = shouldFilter.value
-      let marjorArr = []; let standardArr = []; let basicsArr = []
-      arrState.major ? originalData.value.forEach((item) => { item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? marjorArr.push(item) : '' }) : ''
-      arrState.standard ? originalData.value.forEach((item) => {item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ') && !item.service.includes('B6V5J6NP'))  ? standardArr.push(item) : '' }) : ''
-      arrState.basics ? originalData.value.forEach((item) => { !item.service.includes('YMPCVCIM') && !item.service.includes('YPXSJ6NJ') && !item.service.includes('B6V5J6NP') ? basicsArr.push(item) : '' }) : ''
-      let versionArr = [...marjorArr, ...standardArr, ...basicsArr]
+      let marjorArr = []; let standardArr = []; let basicsArr = []; let customArr = [];
+      debugger;
+      // 專業版
+      arrState.major ? originalData.value.forEach((item) => { 
+        //debugger;
+        let scaleVersionbool = false
+        if(item.edition !== null){
+          if(item.edition.scaleVersion !== null && item.edition.scaleVersion !== ""){
+            scaleVersionbool = true;
+          }              
+        }
+        if(!scaleVersionbool){ item.service.includes('YPXSJ6NJ') && item.service.includes('B6V5J6NP') ? marjorArr.push(item) : ''; }       
+        }) : ''
+        // 標準版
+      arrState.standard ? originalData.value.forEach((item) => {
+        let scaleVersionbool = false
+        if(item.edition !== null){
+          if(item.edition.scaleVersion !== null && item.edition.scaleVersion !== ""){
+            scaleVersionbool = true;
+          }              
+        }
+        if(!scaleVersionbool){ item.service.includes('YMPCVCIM') && (!item.service.includes('YPXSJ6NJ') && !item.service.includes('B6V5J6NP'))  ? standardArr.push(item) : ''  }       
+        }) : '';
+        // 基礎版
+      arrState.basics ? originalData.value.forEach((item) => {         
+         let scaleVersionbool = false
+        if(item.edition !== null){
+          if(item.edition.scaleVersion !== null && item.edition.scaleVersion !== ""){
+            scaleVersionbool = true;
+          }              
+        }
+        if(!scaleVersionbool){ !item.service.includes('YMPCVCIM') && !item.service.includes('YPXSJ6NJ') && !item.service.includes('B6V5J6NP') ? basicsArr.push(item) : '' ; }     
+         }) : ''
+        // 自訂版
+      arrState.custom ? originalData.value.forEach((item) => {                 
+        if(item.edition !== null){
+          if(item.edition.scaleVersion !== null && item.edition.scaleVersion !== ""){
+            customArr.push(item)
+          }              
+        }        
+         }) : ''
+      
+      let versionArr = [...marjorArr, ...standardArr, ...basicsArr, ...customArr]
       console.log(versionArr, '合并结果')
       tableData.value = versionArr
       tablesccnt.value = versionArr.length

+ 15 - 3
TEAMModelBI/Controllers/BISchool/BatchSchoolController.cs

@@ -193,6 +193,8 @@ namespace TEAMModelBI.Controllers.BISchool
                         if (createSchoolInfo.id != null)
                         {
                             string campusId = Guid.NewGuid().ToString();
+                            TEAMModelOS.SDK.Models.Edition edition = new();
+                            edition.scaleVersion = bischool.scaleVersion;
                             School upSchool = new()
                             {
                                 id = createSchoolInfo.id,
@@ -219,6 +221,7 @@ namespace TEAMModelBI.Controllers.BISchool
                                 //modules=bischool?.modules,
                                 openLessonRecord = (_option.Location.Contains("Global")) ? false : true,
                                 createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                                edition = edition
 
                             };
                             scInfos.Add(createSchoolInfo);
@@ -1046,6 +1049,7 @@ namespace TEAMModelBI.Controllers.BISchool
                 jsonElement.TryGetProperty("address", out JsonElement address);
                 string code = (jsonElement.TryGetProperty("code", out JsonElement _code))? _code.GetString() : string.Empty;
                 jsonElement.TryGetProperty("assist", out JsonElement assist);
+                jsonElement.TryGetProperty("scaleVersion", out JsonElement scaleVersion);
                 //手動追加商業模組的部分先封印,商業模組需要經過訂單系統下單控管。
                 //List<string> modules = null ;
                 //if (!jsonElement.TryGetProperty("modules ", out JsonElement _modules))
@@ -1055,7 +1059,7 @@ namespace TEAMModelBI.Controllers.BISchool
                 //else {
                 //    modules= _modules.ToObject<List<string>>();
                 //}
-              
+
                 List<IdInfo> idInfos = assist.ToObject<List<IdInfo>>();
                 //jsonElement.TryGetProperty("site", out JsonElement site);//分开部署,就不需要,一站多用时,取消注释
 
@@ -1100,6 +1104,7 @@ namespace TEAMModelBI.Controllers.BISchool
                         tempShool.city = string.IsNullOrEmpty($"{city}") ? tempShool.city : $"{city}";
                         tempShool.dist = string.IsNullOrEmpty($"{dist}") ? tempShool.dist : $"{dist}";
                         tempShool.address = string.IsNullOrEmpty($"{address}") ? tempShool.address : $"{address}";
+                        
                         //計算學校版本
                         List<SchoolProductSumData> services = new List<SchoolProductSumData>();
                         Azure.Response productSumResponse = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{_schoolId}", new PartitionKey("ProductSum"));
@@ -1112,12 +1117,14 @@ namespace TEAMModelBI.Controllers.BISchool
                             }
                         }
                         tempShool.edition = BISchoolService.calSchoolEdition(tempShool, services.Select(s => s.prodCode).ToList());
+                        //tempShool.edition.scaleVersion = string.IsNullOrEmpty($"{scaleVersion}") ? tempShool.edition.scaleVersion : $"{scaleVersion}";
+                        tempShool.edition.scaleVersion = ($"{scaleVersion}" == null) ? tempShool.edition.scaleVersion : $"{scaleVersion}";
 
                         //修改学校
                         await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempShool, tempShool.id, new PartitionKey("Base"));
 
                         //创建学校信息中间件
-                        //await BIStats.SetSchoolBIRelation(cosmosClient, blobClient, tableClient, _dingDing, tempShool);
+                        await BIStats.SetSchoolBIRelation(cosmosClient, blobClient, tableClient, _dingDing, tempShool);
 
                         //修改学校教师关联的信息
                         string sql = $"SELECT distinct value(c) FROM c join A1 in c.schools where A1.schoolId='{tempShool.id}'";
@@ -1169,7 +1176,7 @@ namespace TEAMModelBI.Controllers.BISchool
                         biRel.scale = tempShool.scale;
                         biRel.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         biRel.areaName = aName;
-                        biRel.edition = tempShool.edition;
+                        biRel.edition = tempShool.edition;                                                
                         if (idInfos.Count > 0)
                         {
                             foreach (var item in idInfos)
@@ -1972,10 +1979,15 @@ namespace TEAMModelBI.Controllers.BISchool
             /// </summary>
             public string standard { get; set; }
             /// <summary>
+            /// 規模版本
+            /// </summary>
+            public string scaleVersion { get; set; }
+            /// <summary>
             /// 手动增加的模块 ["art"]
             /// </summary>
             //public List<string> modules { get; set; } = new List<string>();
         }
+        
 
         /// <summary>
         /// 学段类型和学段名称

+ 4 - 4
TEAMModelBI/appsettings.Development.json

@@ -109,18 +109,18 @@
     "proDeptId": 67690917
   },
   "CoreServiceV1": {
-	"Cosmos": {
+    "Cosmos": {
       "ConnectionString": "AccountEndpoint=https://corecosmosdbcn.documents.azure.cn:443/;AccountKey=WIFUWgnC6HiPb4yYba5iLR4ZghcA2fqrEvnX00YTA5B4sd7o89sxtbvgFDDUqT2VRkeWrWVTWZ8VbApQtwkJKQ==;" //CSV1大陸正式站(唯讀)
     }
   },
   "CoreServiceV2": {
-	"Cosmos": {
+    "Cosmos": {
       "ConnectionString": "AccountEndpoint=https://teammodelostest.documents.azure.cn:443/;AccountKey=ReGoiHuTbU4Q31YYq4NaiormE6Ci71piT7OrvTzAuhrlgt63ajdtDZmwOZKzcz6gnwR326mJp53InY7rohepQQ==;" //CSV2大陸測試站(讀寫)
     },
-	"Storage": {
+    "Storage": {
       "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=teammodeltest;AccountKey=O2W2vadCqexDxWO+px+QK7y1sHwsYj8f/WwKLdOdG5RwHgW/Dupz9dDUb4c1gi6ojzQaRpFUeAAmOu4N9E+37A==;EndpointSuffix=core.chinacloudapi.cn" //CSV2大陸測試站
     },
-	"CosmosCnRead": {
+    "CosmosCnRead": {
       "ConnectionString": "AccountEndpoint=https://corecosmosdb.documents.azure.cn:443/;AccountKey=12C5n8IvXFqsPARUb2YBOUWiU9PksohESlLHgH6cAVajxWBBJIJ6chJusgfrYhxCKgQgSHHxVgHsFPRakhvlPw==;" //CSV2大陸正式站(唯讀)
     }
   }

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/BI/BISchool/BIRelation.cs

@@ -114,4 +114,6 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI.BISchool
         /// </summary>
         public string picture { get; set; }
     }
+
+    
 }

+ 5 - 1
TEAMModelOS.SDK/Models/Cosmos/School/School.cs

@@ -166,6 +166,10 @@ namespace TEAMModelOS.SDK.Models
         /// 历史最高版本  1 基础班  2标准版  3 专业版
         /// </summary>
         public int record { get; set; } = 1;
+        /// <summary>
+        /// 規模版本
+        /// </summary>
+        public string scaleVersion { get; set; }
     }
 
     /// <summary>
@@ -174,5 +178,5 @@ namespace TEAMModelOS.SDK.Models
     public class VirtualBase : School
     {
         public string areaName { get; set; }
-    } 
+    }
 }

+ 63 - 0
TEAMModelOS.SDK/Models/Cosmos/Student/ArtAttachment.cs

@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Student
+{
+    public  class ArtAttachment : CosmosEntity
+    {
+        public ArtAttachment()
+        {
+            pk = "ArtAttachment";
+        }
+        public string artId { get; set; }
+        public string studentId { get; set; }
+        /// <summary>
+        /// 任务id
+        /// </summary>
+        public string taskId { get; set; }
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string taskName { get; set; }
+        /// <summary>
+        /// 科目id
+        /// </summary>
+        public string subjectId { get; set; }
+        /// <summary>
+        /// 科目名称
+        /// </summary>
+        public string subjectName { get; set; }
+        /// <summary>
+        /// 指标id
+        /// </summary>
+        public string quotaId { get; set; }
+        /// <summary>
+        /// 指标名称
+        /// </summary>
+        public string quotaName { get; set; }
+        /// <summary>
+        /// 指标类型-1未设定 0评分,1评测,2作业
+        /// </summary>
+        public int quotaType { get; set; }
+        public string address { get; set; }
+        public string time { get; set; }
+        public string duration { get; set; }
+        public string achievement { get; set; }
+        public string name { get; set; }
+        public string des { get; set; }
+        //0 艺术作品 1 等级证书
+        public int artType { get; set; }
+        // 0 校级 1 区级 2 市级 3 省级 4 国家级
+        public int level { get; set; }
+        public long uploadTime { get; set; }
+        public long updateTime { get; set; }
+        /// <summary>
+        /// 上传的文件
+        /// </summary>
+        public List<Attachment> files { get; set; }
+
+    }
+}

+ 2 - 15
TEAMModelOS.SDK/Models/Cosmos/Student/StudentArtResult.cs

@@ -72,22 +72,9 @@ namespace TEAMModelOS.SDK.Models
         /// <summary>
         /// 分数
         /// </summary>
-        public double score { get; set; } = -1;
-        public string address { get; set; }
-        public string time { get; set; }
-        public string duration { get; set; }
-        public string achievement { get; set; }
-        public string name { get; set; }
-        public string des { get; set; }
-        //0 艺术作品 1 等级证书
-        public int artType { get; set; }
-        // 0 校级 1 区级 2 市级 3 省级 4 国家级
-        public int level { get; set; }
-        /// <summary>
-        /// 上传的文件
-        /// </summary>
+        public double score { get; set; } = -1;      
+        public string name { get; set; }      
         public List<Attachment> files { get; set; }
-
         /// <summary>
         /// 分数结果来源    0醍摩豆系统分数结果   1智音传分数结果
         /// </summary>

+ 1 - 0
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -540,6 +540,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 bIRelation.scale = school.scale;
                 bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 bIRelation.areaName = aName;
+                bIRelation.edition = school.edition;
 
                 if (resBiRel.Status == 200)
                 {

+ 4 - 0
TEAMModelOS/ClientApp/src/api/index.js

@@ -250,6 +250,10 @@ export default {
                 case 'wechat':
                     result = 'https://open.weixin.qq.com/connect/qrconnect?appid=wx207be4d5a37eca4a&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_login&state=wechat#wechat_redirect'
                     break;
+                case 'educloudtw':
+                    result = 'https://oidc.tanet.edu.tw/oidc/v1/azp?response_type=code&client_id=c58722f58275a8c81fcc5ed6b94f3e7b&redirect_uri=' + redirect_uri + '&scope=openid+email+profile&state=educloudtw&nonce=aaaaa'
+                    // 教育雲測試站 // result = 'https://oidc.sso.edu.tw/oidc/v1/azp?response_type=code&client_id=9d8bfb91c18efafd423433d6d21ca2f3&redirect_uri=' + redirect_uri + '&scope=openid+email+profile&state=educloudtw&nonce=aaaaa'
+                    break
             }
 
             resolve(result)

+ 139 - 0
TEAMModelOS/ClientApp/src/icons/svg/educloudtw.svg

@@ -0,0 +1,139 @@
+
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="217px" height="216px" viewBox="0 0 217 216" enable-background="new 0 0 217 216" xml:space="preserve">  <image id="image0" width="217" height="216" x="0" y="0"
+    href="data:image/png;base64,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
+AAAAAElFTkSuQmCC" />
+</svg>

+ 5 - 0
TEAMModelOS/ClientApp/src/view/login/page/Student.less

@@ -1,3 +1,8 @@
+.icon-educlowudtw {
+    font-size: 49px;
+    padding: 6px;
+    border-radius: 9px;
+}
 .loginDiv{
     display: flex;
     align-items: center;

+ 11 - 0
TEAMModelOS/ClientApp/src/view/login/page/Student.vue

@@ -163,22 +163,32 @@
                     <Icon custom="iconfont icon-dingding" class="other-login-icon" />
                     <p class="other-login-text">DingDing</p>
                 </div> -->
+          <!-- facebook -->
           <div class="other-login-item" @click="oauthLogin('facebook')" v-if="srvAdr == 'Global'">
             <Icon type="logo-facebook" class="other-login-icon" />
             <p class="other-login-text">
               {{$t('login.communy.fb')}}
             </p>
           </div>
+          <!-- google -->
           <div class="other-login-item" @click="oauthLogin('google')" v-if="srvAdr == 'Global'">
             <Icon custom="iconfont icon-google" class="other-login-icon" />
             <p class="other-login-text">
               {{$t('login.communy.google')}}
             </p>
           </div>
+          <!-- 微信 -->
           <div style="margin:auto" class="other-login-item" v-if="srvAdr == 'China'" @click="oauthLogin('wechat')">
             <Icon custom="iconfont icon-wechat" class="other-login-icon" />
             <p class="other-login-text">{{$t('login.communy.wechat')}}</p>
           </div>
+          <!-- 教育雲 -->
+          <div class="other-login-item" @click="oauthLogin('educloudtw')" v-if="srvAdr == 'Global'">
+            <v-icon iconClass="educloudtw" class="icon-educlowudtw"></v-icon>
+            <p class="other-login-text">
+              {{$t('教育雲')}}
+            </p>
+          </div>
         </div>
       </div>
       <!-- 醍摩豆qrcode登录 -->
@@ -266,6 +276,7 @@ import {
   mapState,
   mapGetters
 } from 'vuex'
+import "@/icons/svg/educloudtw.svg";
 
 export default {
   data() {

+ 5 - 0
TEAMModelOS/ClientApp/src/view/login/page/Teacher.less

@@ -1,3 +1,8 @@
+.icon-educlowudtw {
+    font-size: 49px;
+    padding: 6px;
+    border-radius: 9px;
+}
 .loginDiv{
     display: flex;
     align-items: center;

+ 8 - 0
TEAMModelOS/ClientApp/src/view/login/page/Teacher.vue

@@ -168,6 +168,13 @@
             {{$t('login.communy.wechat')}}
           </p>
         </div>
+        <!-- 教育雲 -->
+        <div class="other-login-item" @click="oauthLogin('educloudtw')" v-if="srvAdr == 'Global'">
+          <v-icon iconClass="educloudtw" class="icon-educlowudtw"></v-icon>
+          <p class="other-login-text">
+            {{$t('教育雲')}}
+          </p>
+        </div>
       </div>
     </div>
     <div class="right-box" v-show="qrloginFlag">
@@ -212,6 +219,7 @@ import { EventSourcePolyfill } from 'event-source-polyfill';
 import QRCode from 'qrcodejs2'
 import { User } from '@/service/User'
 import { mapState, mapGetters } from 'vuex'
+import "@/icons/svg/educloudtw.svg";
 export default {
   data() {
     const validateID = (rule, value, callback) => {

+ 119 - 113
TEAMModelOS/Controllers/Client/AClassONEController.cs

@@ -3,6 +3,7 @@ using Azure.Storage.Blobs.Models;
 using Azure.Storage.Sas;
 using DocumentFormat.OpenXml.Drawing.Charts;
 using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2021.DocumentTasks;
 using DocumentFormat.OpenXml.Spreadsheet;
 using DocumentFormat.OpenXml.Wordprocessing;
 using HTEXLib.COMM.Helpers;
@@ -25,6 +26,7 @@ using System.Reflection;
 using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModelOS.Controllers.Analysis;
 using TEAMModelOS.Controllers.Both;
 using TEAMModelOS.Filter;
 using TEAMModelOS.Models;
@@ -33,6 +35,7 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
+using TEAMModelOS.SDK.Models.Cosmos.Student;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Services;
 using TEAMModelOS.Services;
@@ -903,8 +906,8 @@ namespace TEAMModelOS.Controllers
                 //    }
                 //}
                 // arts = arts.Where((x, i) => arts.FindIndex(z => z.id == x.id) == i).ToList();
-                List<(string artId, double count)> attachments = new();
-                foreach (ArtEvaluation art in arts) {
+                //List<(string artId, double count)> attachments = new();
+               /* foreach (ArtEvaluation art in arts) {
                     List<StudentArtResult> artResults = new();
                     string stu = string.Format("{0}{1}{2}", code.GetString(), "-", stuId.GetString());
                     string sql = $"select value(c) from c where c.artId = '{art.id}' and c.id = '{stu}' and c.pk = 'ArtResult'";
@@ -929,6 +932,15 @@ namespace TEAMModelOS.Controllers
                         attachments.Add((art.id, 0));
                     }
                    
+                }*/
+                List<string> artIds = new();
+                artIds = arts.Select(c => c.id).ToList();
+                List<ArtAttachment> artAttachments = new();
+                string sqlTask = $"select value(c)  from c where c.studentId = '{stuId}' and c.artId in ({string.Join(",", artIds.Select(s => $"'{s}'"))})";
+                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
+                GetItemQueryIterator<ArtAttachment>(queryText: sqlTask, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ArtAttachment-{code}") }))
+                {
+                    artAttachments.Add(item);
                 }
                 var newArts = arts.Select(c => new { 
                 
@@ -951,7 +963,7 @@ namespace TEAMModelOS.Controllers
                     c.period,
                     c.periodType,
                     c.zymusicstds,c.code,
-                    attachments.Where(z => z.artId.Equals(c.id))?.FirstOrDefault().count
+                    count = artAttachments.Where(z => z.artId.Equals(c.id)).SelectMany(k => k.files).ToList().Count
 
                 });
                 return Ok(new { arts = newArts ,token});
@@ -987,14 +999,24 @@ namespace TEAMModelOS.Controllers
                     result = json.ToObject<StudentArtResult>();                 
                   
                 }
+                List<string> taskIds = new();
+                taskIds = result.results.Select(c => c.taskId).ToList();
+                List<ArtAttachment> artAttachments = new();
+                string sqlTask = $"select value(c)  from c where c.studentId = '{stuId}' and c.taskId in ({string.Join(",", taskIds.Select(s => $"'{s}'"))})";
+                await foreach (var item in _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, Constant.Student).
+                GetItemQueryIterator<ArtAttachment>(queryText: sqlTask, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ArtAttachment-{code}") }))
+                {
+                    artAttachments.Add(item);
+                }
+
                 var resArt = await client.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync(artId.ToString(), new PartitionKey($"Art-{code}"));
                 if (resArt.Status == 200)
                 {
-                    using var json = await JsonDocument.ParseAsync(res.ContentStream);
+                    using var json = await JsonDocument.ParseAsync(resArt.ContentStream);
                     art = json.ToObject<ArtEvaluation>();
 
                 }
-                return Ok(new { result,art });
+                return Ok(new { result,art, artAttachments });
             }
             catch (Exception e)
             {
@@ -1013,15 +1035,11 @@ namespace TEAMModelOS.Controllers
             try
             {
                 var client = _azureCosmos.GetCosmosClient();
-                if (!element.TryGetProperty("artId", out JsonElement artId)) return BadRequest();
-                if (!element.TryGetProperty("classId", out JsonElement classId)) return BadRequest();
-                if (!element.TryGetProperty("acId", out JsonElement acId)) return BadRequest();
-                if (!element.TryGetProperty("subject", out JsonElement subject)) return BadRequest();
-                if (!element.TryGetProperty("code", out JsonElement school)) return BadRequest();
+                //if (!element.TryGetProperty("code", out JsonElement school)) return BadRequest();
                 if (!element.TryGetProperty("attachments", out JsonElement stus)) return BadRequest();
-                List<stuFiles> stuFiles = stus.ToObject<List<stuFiles>>();
+                stuFiles files = stus.ToObject<stuFiles>();
                 List<string> value = new List<string>();
-                await foreach (var s in stuTask(stuFiles, client, school.GetString(), artId.GetString(), classId.GetString(), acId.GetString(), subject.GetString()))
+                await foreach (var s in stuTask(files, client))
                 {
                     if (s.code == 1)
                     {
@@ -1030,122 +1048,104 @@ namespace TEAMModelOS.Controllers
                 }
                 if (value.Count > 0)
                 {
-                    return Ok(new { code = 1, msg = "学生ID上传异常", value = value });
+                    return Ok(new { code = 400, msg = "学生ID上传异常", value });
                 }
                 else
                 {
-                    return Ok(new { code = 0 });
+                    return Ok(files);
                 }
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},art/uploadAll()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},aclassone/uploadAll()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
                 return Ok(new { code = 500, msg = ex.Message });
             }
 
         }
-        private async IAsyncEnumerable<(int code, string value)> stuTask(List<stuFiles> stuFiles, CosmosClient client, string school, string artId, string classId, string acId, string subject)
-        {
 
-            List<string> classIds = new List<string> { classId };
-            foreach (var request in stuFiles)
+        [ProducesDefaultResponseType]
+        [HttpPost("delete")]
+#if !DEBUG
+        [Authorize(Roles = "AClassONE")]
+#endif
+        public async Task<IActionResult> deleteFiels(JsonElement element)
+        {
+            try
             {
-                string value = "";
-                int code = 0;
-                try
+                var client = _azureCosmos.GetCosmosClient();
+                if (!element.TryGetProperty("id", out JsonElement id)) return BadRequest();
+                if (!element.TryGetProperty("code", out JsonElement code)) return BadRequest();
+                await client.GetContainer("TEAMModelOS", "Student").DeleteItemStreamAsync(id.GetString(), new PartitionKey($"ArtAttachment-{code}"));
+                return Ok();
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"OS,{_option.Location},aclassone/delete()\n{ex.Message}\n{ex.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                return Ok(new { code = 500, msg = ex.Message });
+            }
+
+        }
+        private async IAsyncEnumerable<(int code, string value)> stuTask(stuFiles files, CosmosClient client)
+        {
+            string value = "";
+            int code = 0;
+            try {
+                if (string.IsNullOrEmpty(files.id))
                 {
-                    long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    StudentArtResult artResult;
-                    ArtEvaluation art;                                      
-                    string rId = string.Format("{0}{1}{2}", school, "-", request.stuId);
-                    //首先根据大ID获取整个活动得内容
-                    var aresponse = await client.GetContainer("TEAMModelOS", "Common").ReadItemStreamAsync(artId, new PartitionKey($"Art-{school}"));
-                    if (aresponse.Status == 200)
+                    ArtAttachment attachment = new()
                     {
-                        using var json = await JsonDocument.ParseAsync(aresponse.ContentStream);
-                        art = json.ToObject<ArtEvaluation>();
-                        var response = await client.GetContainer("TEAMModelOS", "Student").ReadItemStreamAsync(rId, new PartitionKey($"ArtResult-{artId}"));
-                        if (response.Status == 200)
-                        {
-                            using var json_1 = await JsonDocument.ParseAsync(response.ContentStream);
-                            artResult = json_1.ToObject<StudentArtResult>();
-                            List<Attachment> files = new();
-                            files = request.attachments;
-                            //bool flage = artResult.results.Exists(a => a.taskId == request.acId);
-                            artResult.results.ForEach(a =>
-                            {
-                                if (a.taskId == acId)
-                                {
-                                    a.address = request.address;
-                                    a.duration = request.duration;
-                                    a.achievement = request.achievement;
-                                    a.time = request.time;
-                                    a.name = request.name;
-                                    a.des = request.des;
-                                    a.artType = request.artType;
-                                    a.level = request.level;
-                                    a.files = files;
-                                }
-                            });
-                            await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(artResult, artResult.id, new PartitionKey($"{artResult.code}"));
-                        }
-                        else
-                        {
-                            artResult = new StudentArtResult
-                            {
-                                id = rId,
-                                pk = "ArtResult",
-                                code = $"ArtResult-{artId}",
-                                studentId = request.stuId,
-                                //picture = picture,
-                                studentName = request.name,
-                                school = school,
-                                userType = request.userType,
-                                artId = artId,
-                                classIds = classIds,
-                            };
-                            foreach (var qIds in art.settings)
-                            {
-                                foreach (var task in qIds.task)
-                                {
-                                    ArtQuotaResult quotaResult = new()
-                                    {
-                                        quotaId = qIds.id,
-                                        quotaName = qIds.quotaname,
-                                        quotaType = (int)task.type,
-                                        subjectId = task.subject,
-                                        taskId = task.acId
-                                    };
-                                    if (!string.IsNullOrEmpty(quotaResult.taskId))
-                                    {
-                                        if (quotaResult.taskId.Equals(acId))
-                                        {
-                                            quotaResult.name = request.name;
-                                            quotaResult.des = request.des;
-                                            quotaResult.address = request.address;
-                                            quotaResult.duration = request.duration;
-                                            quotaResult.achievement = request.achievement;
-                                            quotaResult.time = request.time;
-                                            quotaResult.artType = request.artType;
-                                            quotaResult.level = request.level;
-                                            quotaResult.files = request.attachments;
-                                        }
-                                    }
-                                    artResult.results.Add(quotaResult);
-                                }
-                            }
+                        id = Guid.NewGuid().ToString(),
+                        artId = files.artId,
+                        achievement = files.achievement,
+                        address = files.address,
+                        studentId = files.studentId,
+                        taskId = files.taskId,
+                        subjectId = files.subjectId,
+                        quotaId = files.quotaId,
+                        quotaName = files.quotaName,
+                        uploadTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                        duration = files.duration,
+                        name = files.name,
+                        des = files.des,
+                        artType = files.artType,
+                        level = files.level,
+                        files = files.files,
+                        ttl = -1,
+                        code = "ArtAttachment-" + files.school
 
-                            await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(artResult, new PartitionKey($"{artResult.code}"));
-                        }
-                    }
+                    };
+                    await client.GetContainer("TEAMModelOS", "Student").CreateItemAsync(attachment, new PartitionKey($"{attachment.code}"));
                 }
-                catch (Exception e)
+                else
                 {
-                    value = request.stuId;
-                    code = 1;
+                    ArtAttachment attachment = new()
+                    {
+                        artId = files.artId,
+                        achievement = files.achievement,
+                        address = files.address,
+                        studentId = files.studentId,
+                        taskId = files.taskId,
+                        subjectId = files.subjectId,
+                        quotaId = files.quotaId,
+                        quotaName = files.quotaName,
+                        updateTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
+                        duration = files.duration,
+                        name = files.name,
+                        des = files.des,
+                        artType = files.artType,
+                        level = files.level,
+                        files = files.files,
+                        ttl = -1,
+                        code = "ArtAttachment-" + files.school
+                    };
+                    await client.GetContainer("TEAMModelOS", "Student").ReplaceItemAsync(attachment, attachment.id, new PartitionKey($"{attachment.code}"));
                 }
-                yield return (code, value);
             }
+            catch (Exception e) {
+                value = files.studentId;
+                code = 1;
+            }
+            yield return (code, value);
         }
 
         private async Task<(int code, WeChatPhone phone)> GetWeChatPhoneNumber(string phoneCode) 
@@ -1228,8 +1228,14 @@ namespace TEAMModelOS.Controllers
         }
         private class stuFiles
         {
-            public string stuId { get; set; }
-            public int userType { get; set; }
+            public string id { get; set; }
+            public string school { get; set; }
+            public string artId { get; set; }
+            public string taskId { get; set; }
+            public string studentId { get; set; }
+            public string quotaId { get; set; }
+            public string quotaName { get; set; }
+            public string subjectId { get; set; }
             public string address { get; set; }
             public string time { get; set; }
             public string duration { get; set; }
@@ -1237,11 +1243,11 @@ namespace TEAMModelOS.Controllers
             public string name { get; set; }
             public string des { get; set; }
             //0 艺术特长  1 艺术体验
-            public int artType { get; set; }
+            public int artType { get; set; } = -1;
             // 0 校级 1 区级 2 市级 3 省级 4 国家级
             public int level { get; set; } = -1;
-
-            public List<Attachment> attachments { get; set; } = new List<Attachment>();
+            public long uploadTime { get; set; }
+            public List<Attachment> files { get; set; } = new List<Attachment>();
         }
 
     }

+ 0 - 23
TEAMModelOS/Controllers/Common/ArtController.cs

@@ -413,13 +413,6 @@ namespace TEAMModelOS.Controllers.Common
                                 if (a.taskId == acId)
                                 {
                                     a.name = request.name;
-                                    a.address = request.address;
-                                    a.duration = request.duration;
-                                    a.achievement = request.achievement;
-                                    a.time = request.time;
-                                    a.des = request.des;
-                                    a.artType = request.artType;
-                                    a.level = request.level;
                                     a.files = files;
                                 }
                             });
@@ -457,13 +450,6 @@ namespace TEAMModelOS.Controllers.Common
                                         if (quotaResult.taskId.Equals(acId))
                                         {
                                             quotaResult.name = request.name;
-                                            quotaResult.address = request.address;
-                                            quotaResult.duration = request.duration;
-                                            quotaResult.achievement = request.achievement;
-                                            quotaResult.time = request.time;
-                                            quotaResult.des = request.des;
-                                            quotaResult.artType = request.artType;
-                                            quotaResult.level = request.level;
                                             quotaResult.files = request.attachments;
                                         }
                                     }
@@ -1187,15 +1173,6 @@ namespace TEAMModelOS.Controllers.Common
             public string stuId { get; set; }
             public int userType { get; set; }
             public string name { get; set; }
-            public string des { get; set; }
-            public string address { get; set; }
-            public string time { get; set; }
-            public string duration { get; set; }
-            public string achievement { get; set; }
-            //0 艺术作品 1 等级证书
-            public int  artType { get; set; }
-            // 0 校级 1 区级 2 市级 3 省级 4 国家级
-            public int level { get; set; } = -1;
             public List<Attachment> attachments { get; set; } = new List<Attachment>();
         }
     }

+ 1 - 1
TEAMModelOS/TEAMModelOS.csproj

@@ -109,7 +109,7 @@
     <!-- Build Target: Restore NPM packages using npm -->
     <Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
 
-    <Exec WorkingDirectory="$(SpaRoot)" Command="cnpm install" />
+    <Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
   </Target>
 
   <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">