Browse Source

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

XW 1 year ago
parent
commit
53d38efc99

+ 9 - 1
TEAMModelBI/ClientApp/src/api/index.js

@@ -610,5 +610,13 @@ export default {
     // 發送
     pushNotify(data) {
         return post('/coupon/push-notify',data)
-    }
+    },
+    //統購平台 - 縣市名額設定
+    setPurchaseSeats(data) {
+        return post('https://bb-rc.teammodel.net/bbauthapi/set-purchase-seats', data)
+    },
+    //統購平台 - 取得統購平台列表
+    getBBPurchase(data) {
+        return post('/schoolcheck/get-bbpurchase',data)
+    },
 }

+ 9 - 8
TEAMModelBI/ClientApp/src/router/index.js

@@ -17,14 +17,7 @@ const routes = [
         name: "test",
         roles: "all",
         component: () => require.ensure([], (require) => require(`@/view/index/test.vue`))
-    },
-    // 統購平台
-    {
-        path: "/adminpanel",
-        name: "adminpanel",
-        roles: ['admin'],                
-        component: () => require.ensure([], (require) => require(`@/view/htcommunity/adminpanel.vue`))
-    },
+    },   
     // {
     //     path: "/dashboard",
     //     name: "dashboard",
@@ -83,6 +76,14 @@ const routes = [
                 isShow: true,
                 component: () => require.ensure([], (require) => require(`@/view/product/index.vue`))
             },
+            // 統購平台
+            {
+                path: "adminpanel",
+                name: "adminpanel",
+                permission: "teacher-read|teacher-upd",
+                roles: ['admin'],                
+                component: () => require.ensure([], (require) => require(`@/view/htcommunity/adminpanel.vue`))
+            },
             //区校管理(学区管理)--研发部
             {
                 name: "areaManagement",

+ 3 - 2
TEAMModelBI/ClientApp/src/until/http.js

@@ -3,7 +3,7 @@ axios.defaults.timeout = 1000000; //设置超时时长
 axios.defaults.baseURL = '';
 //http request 拦截器
 axios.interceptors.request.use(
-    config => {
+    config => {        
         // const token = getCookie('名称');
         config.data = JSON.stringify(config.data);
         console.log(config, '访问内容')
@@ -35,7 +35,8 @@ axios.interceptors.request.use(
         } else if (config.url.indexOf('ies5') != -1 ||
             config.url.indexOf('tmid') != -1 ||
             config.url.indexOf('/service/PushNotify') != -1 ||
-            config.url.indexOf('prodanalysis') != -1) {
+            config.url.indexOf('prodanalysis') != -1 ||
+            config.url.indexOf('bbauthapi') != -1) {
             config.headers = {
                 'Content-Type': 'application/json',
                 'authorization': 'Bearer ' + JSON.parse(localStorage.access_token)

+ 1 - 1
TEAMModelBI/ClientApp/src/view/common/aside.vue

@@ -163,7 +163,7 @@ export default {
           },
           {
             name: '統購設定',
-            router: '/adminpanel',
+            router: '/home/adminpanel',
             icon: '#icon-laoshi1',
             permission: [],
             isShow: true,

+ 440 - 285
TEAMModelBI/ClientApp/src/view/htcommunity/adminpanel.vue

@@ -1,277 +1,424 @@
-<template>
-    <div class="backgorundbox">
-        <div class="logsbox">
-            <div><span>TEAMModel·BI 数据监控系统</span></div>
+<template>  
+  <div class="containbox">   
+    <el-card class="classcard1" shadow="Always">
+      <span class="classspan">
+        統購平台 - 產品管理
+      </span>     
+      <div style="width: 100%;margin-bottom: 50px;">
+        <el-button type="primary" plain @click="clearform(),(dialogFormVisible= true)"
+          style="float: left;">新增</el-button>
+      </div>
+      <el-divider />
+      <div class="recordbox" style="width: 100%; height: 87vh" v-loading="loading" element-loading-text="loading...">
+        <el-auto-resizer>
+          <template #default="{ height, width }">
+            <el-table-v2 :columns="columns" :data="tableData" :style="{ width: '100%' }" :width="width" :height="height"
+              fixed />
+          </template>
+        </el-auto-resizer>
+      </div>
+    </el-card>
+    <el-dialog v-model="dialogFormVisible" title="購買產品" width="1000" @closed="clearform">
+      <el-form :model="form" :rules="rules" ref="ruleFormRef" :label-position="Top">
+        <el-form-item label="縣市" :label-width="formLabelWidth" prop="region">
+          <el-select v-model="form.region" placeholder="請選擇縣市" :disabled="isRegionDisabled">
+            <el-option v-for="item in optionsData" :key="item.code" :label="item.name" :value="item.code" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="產品名稱" :label-width="formLabelWidth" prop="name">
+          <el-select v-model="form.name" placeholder="請選擇產品" @change="handleChange" :disabled="isNameDisabled">
+            <el-option v-for="item in nameOptions" :key="item.value" :label="item.label" :value="item.value" />            
+          </el-select>
+        </el-form-item>
+        <el-form-item label="空間" :label-width="formLabelWidth" v-show="isShowSpace">
+          <el-input v-model.number="form.space" style="width: 240px" placeholder="請輸入容量" /> &nbsp;&nbsp;(單位GB)
+        </el-form-item>
+        <el-form-item label="擴充項" :label-width="formLabelWidth" v-show="isShowExtensions">
+          <el-checkbox v-model="form.extensions" v-for="item in extensions" :key="item.Key" :label="item.Key"
+            :value="item.Key">
+            {{ item.Name }}
+            <el-input v-model="exqwen[item.Key]" style="width: 100px" placeholder="請輸入數量"
+              v-show="isShowExQwen(item.Key)" />
+          </el-checkbox>
+        </el-form-item>
+        <el-form-item label="使用期限" :label-width="formLabelWidth" prop="time">
+          <el-date-picker v-model="form.time" type="daterange" range-separator="To" start-placeholder="開始時間"
+            end-placeholder="結束時間" :size="size" format="YYYY/MM/DD" value-format="YYYY-MM-DD" />
+        </el-form-item>
+        <el-form-item label="名額" :label-width="formLabelWidth" prop="qwen">
+          <el-input v-model.number="form.qwen" style="width: 240px" placeholder="請輸入名額" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="saveData">
+            確定
+          </el-button>
+          <el-button @click="clearform">取消</el-button>
         </div>
-        <!-- <el-button type="primary" plain @click="quit = true">{{$t(`header.quit`)}}</el-button>       -->
-        <el-space direction="vertical" style="width: 100%;margin-left: auto;margin-right: auto;margin-top: 3%;"
-            shadow="Always">
-
-            <el-card style="width: 60%;" shadow="Always">
-                <span
-                    style="font-size: 20px;border-bottom:1px #000 solid; padding-bottom:5px; margin-bottom: 20px;">統購平台
-                    - 產品管理</span>
-                <!-- <div style="float: right;">
-                    <el-button type="primary" plain @click="routerskip('/AdminLogin')">返回</el-button>
-                </div> -->
-                <div style="float: right;">
-                    <el-button type="primary" plain @click="quit">{{$t(`header.quit`)}}</el-button>
-                </div>
-                <br /><br /><br />
-
-                <el-button type="primary" plain @click="dialogFormVisible = true">新增</el-button>
-                <el-divider />
-                <el-table-v2 :columns="columns" :data="tableData" :width="1500" :height="400" fixed />
-                
-                <!-- <el-table :data="tableData" style="width: 100%; margin-bottom: 50px;">
-                    <el-table-column prop="region" label="縣市" width="200" />
-                    <el-table-column prop="name" label="產品名稱" width="200" />
-                    <el-table-column prop="extensions" label="擴充項" width="400" />
-                    <el-table-column prop="space" label="容量(GB)" width="100" />
-                    <el-table-column prop="qwen" label="名額" width="100" />
-                    <el-table-column prop="time" label="使用期限" width="400" />
-                </el-table> -->
-            </el-card>
-        </el-space>
-        <el-dialog v-model="dialogFormVisible" title="購買產品" width="700" @closed ="clearform">
-            <el-form :model="form">
-                <el-form-item label="縣市" :label-width="formLabelWidth">
-                    <el-select v-model="form.region" placeholder="請選擇縣市">
-                        <el-option label="臺北市" value="臺北市" />
-                        <el-option label="新北市" value="新北市" />
-                        <el-option label="桃園市" value="桃園市" />
-                        <el-option label="新竹市" value="新竹市" />
-                        <el-option label="苗栗市" value="苗栗市" />
-                    </el-select>
-                </el-form-item>
-
-                <el-form-item label="產品名稱" :label-width="formLabelWidth">
-                    <el-select v-model="form.name" placeholder="請選擇產品" @change="handleChange">
-                        <el-option label="Hiteach" value="Hiteach" />
-                        <el-option label="IES5個人空間" value="IES5個人空間" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item label="空間" :label-width="formLabelWidth" v-show="isShowSpace">
-                    <el-input v-model="form.space" style="width: 240px" placeholder="請輸入容量" /> &nbsp;&nbsp;(單位GB)
-                </el-form-item>
-                <el-form-item label="擴充項" :label-width="formLabelWidth" v-show="isShowExtensions">
-                    <el-checkbox v-model="form.extensions" v-for="extension in extensions" :key="extension"
-                        :label="extension" :value="extension">
-                        {{ extension }}
-                    </el-checkbox>
-                </el-form-item>
-                <el-form-item label="使用期限" :label-width="formLabelWidth">
-                    <el-date-picker v-model="form.time" type="daterange" range-separator="To" start-placeholder="開始時間"
-                        end-placeholder="結束時間" :size="size" format="YYYY/MM/DD" value-format="YYYY-MM-DD" />                    
-                </el-form-item>
-                <el-form-item label="名額" :label-width="formLabelWidth">
-                    <el-input v-model="form.qwen" style="width: 240px" placeholder="請輸入名額" />
-                </el-form-item>
-            </el-form>
-            <template #footer>
-                <div class="dialog-footer">
-                    <el-button type="primary" @click="insert">
-                        確定
-                    </el-button>
-                    <el-button @click="clearform">取消</el-button>
-
-                </div>
-            </template>
-        </el-dialog>
-    </div>
+      </template>
+    </el-dialog>
+  </div>
 </template>
   
-  <script setup>
-  //import { reactive } from 'vue'
+  <script setup>  
   import { useRouter } from 'vue-router'
-  import { ref, reactive, onMounted } from 'vue'
+  import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
   import { ElMessage } from 'element-plus'
+  import option_gl from '@/static/regions/region_gl.json'
+  const optionsData = option_gl[0].children
+
+
   //路由
   const routers = useRouter()
+  const ruleFormRef = ref(null)
+  let { proxy } = getCurrentInstance()
 
-  // function quit() {
-  //   debugger
-  //   localStorage.clear();
-  //   routers.push('/QrLogin') 
-  // }
   const dialogFormVisible = ref(false)
+  const isRegionDisabled = ref(false)
+  const isNameDisabled = ref(false)
   const formLabelWidth = '140px'
+  // 檢查數字不可為零
+  const validateNum = (rule, value, callback) => {
+    if (value === 0) {
+      callback(new Error('不可為零'))
+    }
+    callback();
+
+  }
+  // 驗證規則
+  const rules = reactive({
+    region: [
+      {
+        required: true,
+        message: '請選擇縣市'
+      }
+    ],
+    name: [
+      {
+        required: true,
+        message: '請選擇產品名稱'
+      }
+    ],
+    time: [
+      {
+        required: true,
+        message: '請選擇使用期限'
+      }
+    ],
+    qwen: [
+      {
+        required: true,
+        message: '請輸入名額'
+      },
+      { type: 'number', message: '請輸入數字' },
+      { validator: validateNum, trigger: 'blur' },
+    ],
+  })
+
+  // 表單資料
   const form = reactive({
     region: '',
-    name: '',  
-    qwen: '',
-    time:'',
-    space:'',
-    extensions:[],
+    name: '',
+    qwen: 0,
+    time: '',
+    space: 0,
+    extensions: [],
     rowIndex: -1
   })
+  // 擴充項 數量
+  const exqwen = reactive({
+    cligroup: 0,
+    soknumber: 0,
+    client_volume: 0
+  });
+  const nameOptions = reactive([
+    { label: "HiTeach5縣市授權版", value: "VA67B6EZ" },
+    { label: "IES5個人空間縣市授權版", value: "VAA7B6EY" }
+  ]);
+  
   let tableData = reactive([
-      {
-          region: '新北市',
-          name: 'Hiteach',
-          qwen: '600',
-          time: '2024-05-07~2024-05-11',
-          space: '',
-          extensions: ["AI智能終端", "分組數", "禁用硬體IRS", "議課人數", "學校簡碼", "蘇格拉底影片", "智慧評分系統", "雲端診斷分析系統", "蘇格拉底語音轉寫", "蘇格拉底小數據", "蘇格拉底報告", "蘇格拉底桌面", "IRS連線授權數", "USB錄影支援", "AI文句分析", "蘇格拉底議課APP", "電子學生證", "協作", "AI GPT服務"]
-      }
-  ])  
+    // {
+    //   region: '新北市',
+    //   name: 'Hiteach',
+    //   qwen: '600',
+    //   time: '2024-05-07~2024-05-11',
+    //   space: '',
+    //   extensions: ["AI智能終端", "分組數", "禁用硬體IRS", "議課人數", "學校簡碼", "蘇格拉底影片", "智慧評分系統", "雲端診斷分析系統", "蘇格拉底語音轉寫", "蘇格拉底小數據", "蘇格拉底報告", "蘇格拉底桌面", "IRS連線授權數", "USB錄影支援", "AI文句分析", "蘇格拉底議課APP", "電子學生證", "協作", "AI GPT服務"]
+    // }
+  ])
+  let apiListData = reactive([{}])
   let isShowSpace = ref(false)
   let isShowExtensions = ref(false)
-  let extensions = reactive(['AI智能終端',
-                      '禁用硬體IRS',
-                      'USB錄影支援',
-                      'AI文句分析',
-                      '分組數',
-                      '議課人數',
-                      'IRS連線授權數',
-                      '蘇格拉底議課APP',
-                      '蘇格拉底影片',
-                      '學校簡碼',
-                      '蘇格拉底桌面',
-                      '電子學生證',
-                      '智慧評分系統',
-                      '蘇格拉底小數據',
-                      '蘇格拉底報告',
-                      '雲端診斷分析系統',
-                      '蘇格拉底語音轉寫',
-                      '協作',
-                      'AI GPT服務',
-                       ]);  
+  // 擴充項項目
+  const extensions = reactive([
+    {
+      Name: "AI智能終端",
+      Key: "ezs"
+    },
+    {
+      Name: "禁用硬體IRS",
+      Key: "irs"
+    },
+    {
+      Name: "USB錄影支援",
+      Key: "hdcam"
+    },
+    {
+      Name: "AI文句分析",
+      Key: "wordanls"
+    },
+    {
+      Name: "分組數",
+      Key: "cligroup"
+    },
+    {
+      Name: "議課人數",
+      Key: "soknumber"
+    },
+    {
+      Name: "IRS連線授權數",
+      Key: "client_volume"
+    },
+    {
+      Name: "蘇格拉底議課APP",
+      Key: "sokapp"
+    },
+    {
+      Name: "蘇格拉底影片",
+      Key: "sokvdo"
+    },
+    {
+      Name: "學校簡碼",
+      Key: "schoolinfo"
+    },
+    {
+      Name: "蘇格拉底桌面",
+      Key: "sokdesk"
+    },
+    {
+      Name: "電子學生證",
+      Key: "dgistuid"
+    },
+    {
+      Name: "智慧評分系統",
+      Key: "scorsys"
+    },
+    {
+      Name: "蘇格拉底小數據",
+      Key: "soksdata"
+    },
+    {
+      Name: "蘇格拉底報告",
+      Key: "sokrpt"
+    },
+    {
+      Name: "雲端診斷分析系統",
+      Key: "cloudas"
+    },
+    {
+      Name: "蘇格拉底語音轉寫",
+      Key: "sokvtt"
+    },
+    {
+      Name: "協作",
+      Key: "cowork"
+    },
+    {
+      Name: "AI GPT服務",
+      Key: "aigpt"
+    },
+  ]);
+  // 列表欄位
   let columns = ref([
-  {    
-    key: "region",
-    dataKey: "region",
-    title: "城市",
-    width: 200,
-    headerClass: 'general',
-    //sortable:true
-  },
-  {
-    key: "name",
-    dataKey: "name",
-    title: "產品名稱",
-    width: 200,
-    headerClass: 'general',
-    //sortable:true
-  },
-  {
-    key: "extensions",
-    dataKey: "extensions",
-    title: "擴充項",
-    width: 500,
-    headerClass: 'general',    
-    
-    //sortable:true
-  },
-  {
-    key: "space",
-    dataKey: "space",
-    title: "容量(GB)",
-    width: 100,
-    headerClass: 'general',
-    //sortable:true
-  },
-  {
-    key: "qwen",
-    dataKey: "qwen",
-    title: "名額",
-    width: 100,
-    headerClass: 'general',       
-  },
-  {
-    key: "time",
-    dataKey: "time",
-    title: "使用期限",
-    width: 200,
-    headerClass: 'general',       
-  },
-  {
-    key: "handle",
-    title: "",
-    width: 100,
-    align: "center",
-    headerClass: 'btn-class',
-    cellRenderer: (data) =>
-    (
-      <>
-        <el-button type="primary"  onClick={editItem.bind(this,data)}>編輯</el-button>
-      </>
-    )
-  },
-])
-  
-  onMounted(() => {
+    {
+      key: "region",
+      dataKey: "region",
+      title: "城市",
+      width: 110,
+      headerClass: 'general',
+      //sortable:true
+    },
+    {
+      key: "name",
+      dataKey: "name",
+      title: "產品名稱",
+      width: 250,
+      headerClass: 'general',
+      //sortable:true
+    },
+    {
+      key: "extensions",
+      dataKey: "extensions",
+      title: "擴充項",
+      width: 600,
+      headerClass: 'general',
+
+      //sortable:true
+    },
+    {
+      key: "space",
+      dataKey: "space",
+      title: "容量(GB)",
+      width: 120,
+      headerClass: 'general',
+      //sortable:true
+    },
+    {
+      key: "qwen",
+      dataKey: "qwen",
+      title: "名額",
+      width: 100,
+      headerClass: 'general',
+    },
+    {
+      key: "time",
+      dataKey: "time",
+      title: "使用期限",
+      width: 300,
+      headerClass: 'general',
+    },
+    {
+      key: "handle",
+      title: "",
+      width: 100,
+      align: "center",
+      headerClass: 'btn-class',
+      cellRenderer: (data) =>
+      (
+        <>
+          <el-button type="primary" onClick={editItem.bind(this, data)}>編輯</el-button>
+        </>
+      )
+    },
+  ])
+
+  onMounted(() => {    
     //routers.push({ name: 'adminpanel'})  
     //routers.forward()  
-      // 統購平台大陸先遮蔽
-      let siteValue = window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
-      //debugger
-      if (siteValue === 'cn') {
-        routers.push('/home/index')
-      }
-    
+    // 統購平台大陸先遮蔽
+    let siteValue = window.location.host === 'bi.teammodel.cn' ? 'cn' : window.location.host === 'bitest.teammodel.cn' ? 'cn' : 'international'
+    //debugger
+    if (siteValue === 'cn') {
+      routers.push('/home/index')
+    }   
+    getList();    
+  })  
+  function getList() {
+    tableData.splice(0, tableData.length);
+    let data = {};
+    proxy.$api.getBBPurchase(data).then((res) => {
+      apiListData = res;
+      apiListData.forEach((element, index) => {
+        let item = {
+          index:-1,
+          region: '',
+          name: '',
+          qwen: 0,
+          time: '',
+          space: 0,
+          extensions: []
+        }
+        item.index = index;
+        // 設定列表用欄位值 -- start
+        let odItem = optionsData.find(od => od.code == element.cityId)
+        item.region = odItem.name;
+        let noItem = nameOptions.find(no => no.value == element.prodCode)
+        item.name = noItem.label;
+        item.qwen = element.seats;
+        item.time = proxy.$common.timestampToTime(element.startDate, '') + "~" + proxy.$common.timestampToTime(element.endDate, '');
+        item.space = (noItem.value === "VA67B6EZ") ? "--" : element.number;// 如果是Hiteach容量為0        
+        element.aprule.forEach(apItem => {
+          let exItem = extensions.find(ex => ex.Key == apItem.key)
+          item.extensions.push(exItem.Name);
+        });
+        tableData.push(item);
+        // 設定列表用欄位值 -- end
+      });
+    }).catch((error) => {
+      ElMessage.error('API异常')
+    })
+  }
+  function saveData() {        
+    if (!ruleFormRef) return;
+    ruleFormRef.value.validate((valid) => {
+      if (valid) {
+        // 表单验证通过,可以提交表单数据
+        let ap = [];
+        form.extensions.forEach(element => {
+          let val = 1;
+          if (element === "cligroup") { val = exqwen.cligroup; }
+          if (element === "soknumber") { val = exqwen.soknumber; }
+          if (element === "client_volume") { val = exqwen.client_volume; }
+          let item = { "key": element, "val": val }
+          ap.push(item);
+        });
+        let data = {
+          countryId: "TW",
+          provinceId: "",
+          cityId: form.region,
+          dataCenter: "Global",
+          prodCode: form.name,
+          startDate: form.time[0],
+          endDate: form.time[1],
+          seats: form.qwen,
+          number: form.space === "" ? 1 : form.space,
+          ap: ap
+        }
+        console.log(data);             
+        proxy.$api.setPurchaseSeats(data).then((res) => {
+          res.err === '' ? console.log(res, '新增成功') : console.log(res, '新增失敗')
+          clearform();
+          getList();   
+        }).catch((error) => {
+          ElMessage.error('API异常')
+        })
 
-  })
-  function insert(){ 
-     //debugger
-     dialogFormVisible.value = false  
-      if (form.rowIndex === -1) {
-          // 新增模式
-          var item = {
-              region: form.region,
-              name: form.name,
-              qwen: form.qwen,
-              time: form.time[0] + "~" + form.time[1],
-              space: form.space,
-              extensions: form.extensions
-          }
-          tableData.push(item);
-          ElMessage({
-              message: '新增成功!',
-              type: 'success',
-          })
+        // 在这里进行提交表单的操作
       } else {
-          // 編輯模式          
-          tableData[form.rowIndex].region = form.region
-          tableData[form.rowIndex].name = form.name
-          tableData[form.rowIndex].qwen = form.qwen
-          tableData[form.rowIndex].time = form.time[0] + "~" + form.time[1],
-          tableData[form.rowIndex].space = form.space
-          tableData[form.rowIndex].extensions = form.extensions
+        // 表单验证失败,可以给出提示或处理
+        return false;
+      }
+    });
 
-      }       
-    clearform();  
     
+
   }
-  function handleChange(){
-    //debugger
-    if(form.name==='Hiteach'){
-        isShowSpace.value = false;
-        isShowExtensions.value = true;
+  // 產品表單切換
+  function handleChange() {    
+    if (form.name === 'VA67B6EZ') {
+      isShowSpace.value = false;
+      isShowExtensions.value = true;
     }
-    if(form.name==='IES5個人空間'){
-        isShowSpace.value = true;
-        isShowExtensions.value = false;
+    if (form.name === 'VAA7B6EY') {
+      isShowSpace.value = true;
+      isShowExtensions.value = false;
     }
   }
-function  editItem(obj1,obj2) {
-    debugger
+  function editItem(obj1, obj2) {    
     dialogFormVisible.value = true;
-    if(obj1.rowData.name === ""){
-
-    }
-    form.region = obj1.rowData.region
-    form.name = obj1.rowData.name
-    form.qwen = obj1.rowData.qwen
-    form.time = obj1.rowData.time.split('~')
-    form.space = obj1.rowData.space
-    form.extensions = obj1.rowData.extensions
-    form.rowIndex = obj1.rowIndex
+    isRegionDisabled.value = true;
+    isNameDisabled.value = true;
+    let dataIndex = obj1.rowData.index;
+    
+    form.region = apiListData[dataIndex].cityId;    
+    form.name = apiListData[dataIndex].prodCode; 
+    form.qwen = apiListData[dataIndex].seats;
+    form.time = [proxy.$common.timestampToTime(apiListData[dataIndex].startDate, '').trim(), proxy.$common.timestampToTime(apiListData[dataIndex].endDate, '').trim()];
+    form.space = apiListData[dataIndex].number;
+    apiListData[dataIndex].aprule.forEach(item =>{
+      form.extensions.push( item.key );
+      if (item.key === "cligroup" || item.key === "soknumber" || item.key === "client_volume") {
+        exqwen[item.key]=item.val;
+      }
+    })
+    //form.extensions = obj1.rowData.extensions;
+    form.rowIndex = dataIndex;
     handleChange();
     //clearform();
 
-}
-function quit() {
+  }
+  function quit() {
     routers.push('/login?htype=adminlogin')
     localStorage.removeItem('userData')
     localStorage.removeItem('id_token')
@@ -279,22 +426,36 @@ function quit() {
     localStorage.removeItem('management')
     localStorage.removeItem('organization')
     // localStorage.clear()
-}
-function clearform(){
-    form.region= ''
-    form.name= ''  
-    form.qwen= ''
-    form.time=''
-    form.space=''
-    form.extensions=[]
+  }
+  // 重置表單
+  function clearform() {    
+    // 重置表單驗證狀態
+    if (ruleFormRef.value !== null) {
+      ruleFormRef.value.resetFields()
+    }
+    form.region = ''
+    form.name = ''
+    form.qwen = ''
+    form.time = ''
+    form.space = ''
+    form.extensions = []
     form.rowIndex = -1
+    exqwen.client_volume = 0
+    exqwen.cligroup = 0
+    exqwen.soknumber = 0
     isShowSpace.value = false;
     isShowExtensions.value = false;
     dialogFormVisible.value = false
-}
-  
-  </script>
-  
+    isRegionDisabled.value = false;
+    isNameDisabled.value = false;
+   
+  }
+  // 檢查是否為數字型擴充項
+  function isShowExQwen(exKey){      
+      if (exKey === "cligroup" || exKey === "soknumber" || exKey === "client_volume") { return true; } else { return false; }  
+  }
+    
+    </script>
   <style >
   /* .el-table-v2__cell-text{
     white-space:  normal !important;    
@@ -303,39 +464,22 @@ function clearform(){
     width: 100% !important;
     height: auto !important;
   } */
-  
-  </style>
-<style scoped>
-.backgorundbox {
-  background: url("../../assets/img/background1.png") no-repeat;
-  background-size: cover;
-  width: 100vw;
-  height: 100vh;
-  position: relative;
-  /* filter: blur(2px); */
-}
-
-.logsbox {
-    color:#fff;
-    font-size: 34px;
-    text-align: center;
-    width: 95%;
-    line-height: 50px;
-    ;
-    position: relative;
+ .el-main  .containbox  {
+  line-height: 50px!important;
 }
-
-.logsbox .el-icon-s-order {
+.el-table-v2__cell-text{
     font-size: 16px;
-}
-.header-icon {
-  width: 1.2em;
-  height: 1.2em;
-  vertical-align: -0.3em;
-  fill: currentColor;
-  overflow: hidden;
-  margin-right: 5px;
-}
+    color:black;
+    font-weight:500;  
+  }
+  .el-table-v2__header-cell {
+    font-size: 16px;
+    color:black;
+    font-weight: bold;    
+  }
+
+  </style>
+<style scoped>
 
 :deep(.my-label) {
     background: var(--el-color-success-light-9) !important;
@@ -344,5 +488,16 @@ function clearform(){
 :deep(.my-content) {
     background: var(--el-color-danger-light-9);
 }
+.classcard1{
+  width: 97%;margin: 20px 30px 20px 30px ;
+}
+.classspan{
+  font-size: 25px;border-bottom:1px #000 solid; padding-bottom:5px; margin-bottom: 20px;
+}
+.recordbox {
+  width: 100%;
+  padding-left: 1%;
+  padding-right: 1%;  
+}
 
 </style>

+ 84 - 0
TEAMModelBI/Controllers/BISchool/SchoolController.cs

@@ -2606,6 +2606,90 @@ namespace TEAMModelBI.Controllers.BISchool
 
         #endregion
 
+        #region 統購平台用
+        /// <summary>
+        /// 取得CoreBB學校訂單履歷資訊  暂时这样处理
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [HttpPost("get-bbpurchase")]
+        public async Task<IActionResult> GetBBpurchase(JsonElement jsonElement)
+        {
+            List<object> result = new List<object>();
+            try
+            {
+                //var cosmosClientCsv2 = _azureCosmos.GetCosmosClient(name: "CoreServiceV2"); //CosmosDB CSV2
+                //var storageClientCsv2 = _azureStorage.GetCloudTableClient(name: "CoreServiceV2"); //Storage CSV2
+
+                ////取得TMID基本資料
+                //Dictionary<string, TmidStics> tmidDic = new();
+                //QueryDefinition query =
+                //       new QueryDefinition(@"SELECT c.id, c.name, c.picture, c.mobile, c.mail, c.lang, c.wechat, c.facebook, c.google, c.ding, c.apple, c.educloudtw, c.ts FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
+                //       .WithParameter("@key", tmids);
+                //await foreach (var item in cosmosClientCsv2
+                //            .GetContainer("Core", "ID2")
+                //            .GetItemQueryStreamIterator(query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("base") }))
+                //{                   
+                //}
+
+                string sql = $"SELECT * FROM c WHERE c.dataType = 'purchase' ";
+
+                var client = _azureCosmos.GetCosmosClient(name: "CoreServiceV2");
+
+                List<PurchaseSeats> purchaseSeatsList = new List<PurchaseSeats>();
+
+                //await foreach (var item in client.GetContainer("Core", "ID2").GetItemQueryStreamIterator(queryText: sql))
+                //{
+                //    var jsoncs = await JsonDocument.ParseAsync(item.ContentStream);
+                //    if (jsoncs.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                //    {
+                //        foreach (var obj in jsoncs.RootElement.GetProperty("Documents").EnumerateArray())
+                //        {
+
+                //        }
+                //    }
+                //}
+                //await foreach (var item in client.GetContainer("Core", "ID2").GetItemQueryIterator<PurchaseSeats>(queryText: sql))
+                await foreach (var item in client.GetContainer("Habb", "Auth").GetItemQueryIterator<PurchaseSeats>(queryText: sql))
+                {
+                    purchaseSeatsList.Add(item);
+                }
+
+
+
+                return Ok(purchaseSeatsList);
+            }
+            catch (Exception ex)
+            {
+                return BadRequest();
+            }
+        }
+
+        /// <summary>
+        /// 統購授權 縣市名額
+        /// </summary>
+        public class PurchaseSeats
+        {
+            public string id { get; set; } //統購縣市名額ID 格式:{countryId}-{provinceId}-{cityId}-{districtId}-{產品代碼}
+            public string countryId { get; set; } //[String]國家代碼
+            public string provinceId { get; set; } //[String]省代碼
+            public string cityId { get; set; } //[String]市代碼
+            public string districtId { get; set; } //[String]區代碼
+            public string geoName { get; set; } //行政區名稱
+            public string prodCode { get; set; } //產品代碼
+            public long startDate { get; set; } //授權起始日期 unixtimestamp
+            public long endDate { get; set; } //授權終止日期 unixtimestamp
+            public int seats { get; set; } //名額數
+            public int number { get; set; } //產品數量、空間數
+            public int used { get; set; } //已領用名額數
+            public object aprule { get; set; } //產品擴充項
+            public List<string> tmids { get; set; } = new(); //已申請的TMID
+            public string dataType { get; set; } //分區鍵:purchase
+        }
+
+        #endregion
+
         /// <summary>
         /// 未加入区域的学校
         /// </summary>

+ 404 - 380
TEAMModelOS.FunctionV4/CosmosDB/TriggerArt.cs

@@ -216,41 +216,50 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
 
 
                            }*/
-                            string pkey = string.Format("{0}{1}{2}", art.code, "-", "pending");
-                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
-                            var messageVoteEnd = new ServiceBusMessage(new { tdata.id, progress = "finish", tdata.code }.ToJsonString());
-                            messageVoteEnd.ApplicationProperties.Add("name", "Art");
-                            if (voteRecords.Count > 0)
+                            try
                             {
-                                long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                try
+                                var messageVoteEnd = new ServiceBusMessage(new { tdata.id, progress = "finish", tdata.code }.ToJsonString());
+                                messageVoteEnd.ApplicationProperties.Add("name", "Art");
+                                if (voteRecords.Count > 0)
                                 {
-                                    await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                    long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
+                                    try
+                                    {
+                                        await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), voteRecords[0].sequenceNumber);
+                                    }
+                                    catch (Exception)
+                                    {
+                                    }
+                                    voteRecords[0].sequenceNumber = end;
+                                    await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
                                 }
-                                catch (Exception)
+                                else
                                 {
+                                    long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
+                                    ChangeRecord changeRecord = new()
+                                    {
+                                        RowKey = tdata.id,
+                                        PartitionKey = PartitionKey,
+                                        sequenceNumber = end,
+                                        msgId = messageVoteEnd.MessageId
+                                    };
+                                    await table.Save<ChangeRecord>(changeRecord);
                                 }
-                                voteRecords[0].sequenceNumber = end;
-                                await table.SaveOrUpdate<ChangeRecord>(voteRecords[0]);
+
                             }
-                            else
+                            catch (Exception e)
                             {
-                                long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                ChangeRecord changeRecord = new()
-                                {
-                                    RowKey = tdata.id,
-                                    PartitionKey = PartitionKey,
-                                    sequenceNumber = end,
-                                    msgId = messageVoteEnd.MessageId
-                                };
-                                await table.Save<ChangeRecord>(changeRecord);
+                                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-艺术评测going{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
                             }
-
+                           /* finally {
+                                string pkey = string.Format("{0}{1}{2}", art.code, "-", "pending");
+                                await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
+                            }*/
+                            
 
                             break;
                         case "finish":
-                            string pk = string.Format("{0}{1}{2}", art.code, "-", "going");
-                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+
                             //判定是否是区级创建的活动内容
                             /* if (art.lost.Count == 0 && art.pass == 0)
                              {
@@ -343,139 +352,166 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                  }
                              }*/
                             //根据学校编码去获取区级ID
-                            School scInfo = new();
-                            //School scInfo = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{art.school}", partitionKey: new Azure.Cosmos.PartitionKey("Base"));
-                            var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{art.school}", partitionKey: new Azure.Cosmos.PartitionKey("Base"));
-                            if (response.Status == 200)
-                            {
-                                using var cJson = await JsonDocument.ParseAsync(response.ContentStream);
-                                scInfo = cJson.ToObject<School>();
-                            }
-                            ArtSetting setting = new();
-                            try
-                            {
-                                var artResponse = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemStreamAsync($"{scInfo.areaId}", partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
+                            try {
+                                School scInfo = new();
+                                //School scInfo = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>($"{art.school}", partitionKey: new Azure.Cosmos.PartitionKey("Base"));
+                                var response = await client.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync($"{art.school}", partitionKey: new Azure.Cosmos.PartitionKey("Base"));
                                 if (response.Status == 200)
                                 {
-                                    using var json = await JsonDocument.ParseAsync(artResponse.ContentStream);
-                                    setting = json.ToObject<ArtSetting>();
+                                    using var cJson = await JsonDocument.ParseAsync(response.ContentStream);
+                                    scInfo = cJson.ToObject<School>();
                                 }
-                            }
-                            catch (Exception e)
-                            {
-
-                            }
-                            if (art.classes.Any())
-                            {
-                                //获取该艺术评测的评测Id
-                                List<(string id, string subjectId)> ids = new();
-                                List<ExamClassResult> examClassResults = new();
-                                var examId = art.settings.SelectMany(x => x.task).Where(c => c.type == 1).Select(z => new { z.acId, z.subject }).ToList();
-                                examId.ForEach(x =>
-                                {
-                                    ids.Add((x.acId, x.subject));
-                                });
-                                List<string> results = new();
-                                results = ids.Select(x => x.id).ToList();
-                                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId in ({string.Join(",", results.Select(x => $"'{x}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{art.school}") }))
+                                ArtSetting setting = new();
+                                try
                                 {
-                                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                    var artResponse = await client.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemStreamAsync($"{scInfo.areaId}", partitionKey: new Azure.Cosmos.PartitionKey("ArtSetting"));
+                                    if (response.Status == 200)
                                     {
-                                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                        {
-                                            examClassResults.Add(obj.ToObject<ExamClassResult>());
-                                        }
+                                        using var json = await JsonDocument.ParseAsync(artResponse.ContentStream);
+                                        setting = json.ToObject<ArtSetting>();
                                     }
                                 }
-                                //获取该艺术评测下面的评测活动
-                                List<ExamInfo> exams = new();
-                                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryIterator<ExamInfo>(queryText: $"select value(c) from c where c.pk = 'Exam' and c.id in ({string.Join(",", results.Select(o => $"'{o}'"))})"))
+                                catch (Exception e)
                                 {
-                                    exams.Add(item);
-                                }
-                                var sta = examClassResults.SelectMany(x => x.status).ToList();
-                                var ansCount = sta.Where(x => x == 0).ToList();
-                                var persent = ansCount.Count * 1.0 / sta.Count * 100;
-                                var period = scInfo.period.Where(x => x.id.Equals(art.period.id))?.FirstOrDefault();
-
-                                List<StudentArtResult> studentArtResults = new();
-                                string sql = $"SELECT value c FROM c   where  c.pk='ArtResult' ";
-                                await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student)
-                                    .GetItemQueryIterator<StudentArtResult>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ArtResult-{art.id}") }))
-                                {
-                                    studentArtResults.Add(item);
-                                }
-                                List<Task<ItemResponse<StudentArtResult>>> tasks = new List<Task<ItemResponse<StudentArtResult>>>();
-                                //新增数据推送 obj => Portrait
-                                Portrait portrait = new()
-                                {
-                                    schoolCode = art.school,
-                                    periodId = art.period?.id,
-                                    subjectId = "subject_art"
-                                };
-                                //var period = scInfo.period.Where(x => x.id.Equals(art.period.id)).FirstOrDefault();
-                                List<(string ptype, string subId, List<(string name, List<string> kno)> knos)> knoledge = new();
-                                //List<string> subs = new List<string> { "subject_painting", "subject_music" };
-                                if (exams.Count == 0) return; 
-                                foreach (var ss in art.subjects)
-                                {
-                                    if (string.IsNullOrEmpty(exams[0].papers[0].periodId)) {
-                                        
-                                        knoledge.Add(await getKnowledge("university", "hbcn", client, ss.id, "be32942d-97a9-52ba-45d6-2e5b722583f5"));
-                                    } else {
-                                        knoledge.Add(await getKnowledge(art.periodType, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].code, client, ss.id, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].periodId));
-                                    }
-                                   
-                                }
 
-                                List<(string name, double score, double aver, string subject)> blockScore = new();
-                                List<(List<(string name, double score, double point, string subject)> studentScore, string stuId)> studentScores = new();
-                                foreach (var exam in exams)
+                                }
+                                if (art.classes.Any())
                                 {
-                                    HashSet<string> knowledge = new HashSet<string>();
-                                    List<double> point = new List<double>();
-                                    List<List<double>> result = new List<List<double>>();
-                                    List<ClassRange> classes = new List<ClassRange>();
-                                    //求单个知识点所占分数
-                                    List<string> per = new List<string>();
-
-                                    if (exam.papers[0].knowledge != null && exam.papers[0].knowledge.Count > 0)
+                                    //获取该艺术评测的评测Id
+                                    List<(string id, string subjectId)> ids = new();
+                                    List<ExamClassResult> examClassResults = new();
+                                    var examId = art.settings.SelectMany(x => x.task).Where(c => c.type == 1).Select(z => new { z.acId, z.subject }).ToList();
+                                    examId.ForEach(x =>
+                                    {
+                                        ids.Add((x.acId, x.subject));
+                                    });
+                                    List<string> results = new();
+                                    results = ids.Select(x => x.id).ToList();
+                                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId in ({string.Join(",", results.Select(x => $"'{x}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{art.school}") }))
                                     {
-                                        exam.papers[0].knowledge.ForEach(k =>
+                                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                                         {
-                                            k.ForEach(e =>
+                                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
                                             {
-                                                knowledge.Add(e);
-                                            });
-                                        });
+                                                examClassResults.Add(obj.ToObject<ExamClassResult>());
+                                            }
+                                        }
                                     }
-                                    point = exam.papers[0].point;
-
-                                    List<string> knowledgeName = new List<string>();
-                                    foreach (string cla in knowledge)
+                                    //获取该艺术评测下面的评测活动
+                                    List<ExamInfo> exams = new();
+                                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Common).GetItemQueryIterator<ExamInfo>(queryText: $"select value(c) from c where c.pk = 'Exam' and c.id in ({string.Join(",", results.Select(o => $"'{o}'"))})"))
+                                    {
+                                        exams.Add(item);
+                                    }
+                                    var sta = examClassResults.SelectMany(x => x.status).ToList();
+                                    var ansCount = sta.Where(x => x == 0).ToList();
+                                    var persent = ansCount.Count * 1.0 / sta.Count * 100;
+                                    var period = scInfo.period.Where(x => x.id.Equals(art.period.id))?.FirstOrDefault();
+
+                                    List<StudentArtResult> studentArtResults = new();
+                                    string sql = $"SELECT value c FROM c   where  c.pk='ArtResult' ";
+                                    await foreach (var item in client.GetContainer(Constant.TEAMModelOS, Constant.Student)
+                                        .GetItemQueryIterator<StudentArtResult>(queryText: sql, requestOptions: new QueryRequestOptions { PartitionKey = new PartitionKey($"ArtResult-{art.id}") }))
                                     {
-                                        knowledgeName.Add(cla);
+                                        studentArtResults.Add(item);
                                     }
-                                    for (int k = 0; k < knowledgeName.Count; k++)
+                                    List<Task<ItemResponse<StudentArtResult>>> tasks = new List<Task<ItemResponse<StudentArtResult>>>();
+                                    //新增数据推送 obj => Portrait
+                                    Portrait portrait = new()
+                                    {
+                                        schoolCode = art.school,
+                                        periodId = art.period?.id,
+                                        subjectId = "subject_art"
+                                    };
+                                    //var period = scInfo.period.Where(x => x.id.Equals(art.period.id)).FirstOrDefault();
+                                    List<(string ptype, string subId, List<(string name, List<string> kno)> knos)> knoledge = new();
+                                    //List<string> subs = new List<string> { "subject_painting", "subject_music" };
+                                    if (exams.Count == 0) return;
+                                    foreach (var ss in art.subjects)
                                     {
-                                        if (null == knowledgeName[k])
+                                        if (string.IsNullOrEmpty(exams[0].papers[0].periodId))
                                         {
-                                            knowledgeName.Remove(knowledgeName[k]);
+
+                                            knoledge.Add(await getKnowledge("university", "hbcn", client, ss.id, "be32942d-97a9-52ba-45d6-2e5b722583f5"));
+                                        }
+                                        else
+                                        {
+                                            knoledge.Add(await getKnowledge(art.periodType, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].code, client, ss.id, exams.Where(c => c.subjects[0].id.Equals(ss.id))?.FirstOrDefault().papers[0].periodId));
                                         }
+
                                     }
-                                    List<double> Score = new List<double>();
-                                    //List<(string name, double score, string subject)> pointScore = new();
-                                    List<string> stus = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentIds).ToList();
-                                    List<List<double>> stuScores = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentScores).ToList();
-                                    foreach (string id in stus)
+
+                                    List<(string name, double score, double aver, string subject)> blockScore = new();
+                                    List<(List<(string name, double score, double point, string subject)> studentScore, string stuId)> studentScores = new();
+                                    foreach (var exam in exams)
                                     {
-                                        //double scores = 0;
-                                        List<(string name, double score, double point, string subject)> studentScore = new();
+                                        HashSet<string> knowledge = new HashSet<string>();
+                                        List<double> point = new List<double>();
+                                        List<List<double>> result = new List<List<double>>();
+                                        List<ClassRange> classes = new List<ClassRange>();
+                                        //求单个知识点所占分数
+                                        List<string> per = new List<string>();
+
+                                        if (exam.papers[0].knowledge != null && exam.papers[0].knowledge.Count > 0)
+                                        {
+                                            exam.papers[0].knowledge.ForEach(k =>
+                                            {
+                                                k.ForEach(e =>
+                                                {
+                                                    knowledge.Add(e);
+                                                });
+                                            });
+                                        }
+                                        point = exam.papers[0].point;
+
+                                        List<string> knowledgeName = new List<string>();
+                                        foreach (string cla in knowledge)
+                                        {
+                                            knowledgeName.Add(cla);
+                                        }
+                                        for (int k = 0; k < knowledgeName.Count; k++)
+                                        {
+                                            if (null == knowledgeName[k])
+                                            {
+                                                knowledgeName.Remove(knowledgeName[k]);
+                                            }
+                                        }
+                                        List<double> Score = new List<double>();
+                                        //List<(string name, double score, string subject)> pointScore = new();
+                                        List<string> stus = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentIds).ToList();
+                                        List<List<double>> stuScores = examClassResults.Where(c => c.examId.Equals(exam.id)).SelectMany(z => z.studentScores).ToList();
+                                        foreach (string id in stus)
+                                        {
+                                            //double scores = 0;
+                                            List<(string name, double score, double point, string subject)> studentScore = new();
+                                            for (int k = 0; k < knowledgeName.Count; k++)
+                                            {
+                                                int n = 0;
+                                                double OnePoint = 0;
+                                                double scores = 0;
+                                                exam.papers[0].knowledge.ForEach(kno =>
+                                                {
+                                                    if (kno.Contains(knowledgeName[k]))
+                                                    {
+                                                        var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
+                                                        OnePoint += point[n] * itemPersent;
+                                                        int index = stus.IndexOf(id);
+                                                        if (stuScores[index][n] > 0)
+                                                        {
+                                                            scores += stuScores[index][n] * itemPersent;
+                                                        }
+                                                    }
+                                                    n++;
+                                                });
+                                                studentScore.Add((knowledgeName[k], Math.Round(scores, 2), OnePoint, exam.subjects[0].id));
+                                            }
+                                            studentScores.Add((studentScore, id));
+                                        }
                                         for (int k = 0; k < knowledgeName.Count; k++)
                                         {
-                                            int n = 0;
                                             double OnePoint = 0;
+                                            int n = 0;
                                             double scores = 0;
                                             exam.papers[0].knowledge.ForEach(kno =>
                                             {
@@ -483,302 +519,290 @@ namespace TEAMModelOS.FunctionV4.CosmosDB
                                                 {
                                                     var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
                                                     OnePoint += point[n] * itemPersent;
-                                                    int index = stus.IndexOf(id);
-                                                    if (stuScores[index][n] > 0)
+                                                    foreach (string id in stus)
                                                     {
-                                                        scores += stuScores[index][n] * itemPersent;
+                                                        int index = stus.IndexOf(id);
+                                                        if (stuScores[index][n] > 0)
+                                                        {
+                                                            scores += stuScores[index][n] * itemPersent;
+                                                        }
                                                     }
                                                 }
                                                 n++;
                                             });
-                                            studentScore.Add((knowledgeName[k], Math.Round(scores, 2), OnePoint, exam.subjects[0].id));
+                                            double sc = stus.Count > 0 ? Math.Round(scores * 1.0 / stus.Count, 2) : 0;
+                                            blockScore.Add((knowledgeName[k], OnePoint, sc, exam.subjects[0].id));
+                                            //blockScore.AddRange(pointScore);
                                         }
-                                        studentScores.Add((studentScore, id));
                                     }
-                                    for (int k = 0; k < knowledgeName.Count; k++)
+                                    var bls = blockScore.GroupBy(x => x.subject).Select(v => new
                                     {
-                                        double OnePoint = 0;
-                                        int n = 0;
-                                        double scores = 0;
-                                        exam.papers[0].knowledge.ForEach(kno =>
+                                        subjectId = v.Key,
+                                        knoScore = v.ToList().GroupBy(k => k.name).Select(z => new
                                         {
-                                            if (kno.Contains(knowledgeName[k]))
+                                            knoName = z.Key,
+                                            score = z.ToList().Sum(j => j.score),
+                                            aver = z.ToList().Sum(j => j.aver)
+                                        })
+                                    });
+                                    //List<(string subId,List<(string name, List<string> kno)>)> subjectKnow = knoledge.Select(x => new { x.subId, x.knos }).ToList();
+                                    //var subjectKnow;
+                                    var subjectKnow = string.IsNullOrEmpty(exams[0].papers[0].periodId) ? knoledge.Select(x => new { x.subId, x.knos }).ToList() : knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
+                                    /*if (string.IsNullOrEmpty(exams[0].papers[0].periodId))
+                                    {
+                                        var subjectKnow = knoledge.Select(x => new { x.subId, x.knos }).ToList();
+                                    }
+                                    else {
+                                        var subjectKnow = knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
+                                    }*/
+                                    List<(string subjectId, List<(string name, double score, double persent, double aver, List<string> dim)> bks)> bs = new();
+                                    List<(string subjectId, List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks)> sbs = new();
+                                    List<(string name, double score, double av, string sId)> stuBlockScore = new();
+                                    foreach (var bb in subjectKnow)
+                                    {
+                                        var kno1 = bls.Where(c => c.subjectId.Equals(bb.subId)).SelectMany(x => x.knoScore).ToList();
+                                        var stuInfo = studentScores.Select(c => new
+                                        {
+                                            c.stuId,
+                                            subInfo = c.studentScore.Where(x => x.subject.Equals(bb.subId)).ToList()
+                                        }).Where(z => z.subInfo.Count > 0).ToList();
+                                        //var kno2 = dimensions.Where(c => c.subjectBind.Equals(bb.subId)).Select(x => new { x.dimension,x.blocks}).ToList();
+                                        List<(string name, double score, double aver)> blockScores = new();
+                                        foreach (var k2 in bb.knos)
+                                        {
+                                            double bsc = 0;
+                                            double avs = 0;
+                                            foreach (var k3 in kno1)
                                             {
-                                                var itemPersent = kno.Count > 0 ? 1 / Convert.ToDouble(kno.Count) : 0;
-                                                OnePoint += point[n] * itemPersent;
-                                                foreach (string id in stus)
+                                                if (null != k2.kno && k2.kno.Contains(k3.knoName))
                                                 {
-                                                    int index = stus.IndexOf(id);
-                                                    if (stuScores[index][n] > 0)
+                                                    bsc += k3.score;
+                                                    avs += k3.aver;
+                                                }
+                                            }
+                                            foreach (var stu in stuInfo)
+                                            {
+                                                double realScore = 0;
+                                                double realPoint = 0;
+                                                foreach (var subScore in stu.subInfo)
+                                                {
+                                                    if (null != k2.kno && k2.kno.Contains(subScore.name))
                                                     {
-                                                        scores += stuScores[index][n] * itemPersent;
+                                                        realScore = subScore.score;
+                                                        realPoint = subScore.point;
                                                     }
                                                 }
+                                                stuBlockScore.Add((k2.name, realScore, realPoint, stu.stuId));
                                             }
-                                            n++;
-                                        });
-                                        double sc = stus.Count > 0 ? Math.Round(scores * 1.0 / stus.Count, 2) : 0;
-                                        blockScore.Add((knowledgeName[k], OnePoint, sc, exam.subjects[0].id));
-                                        //blockScore.AddRange(pointScore);
-                                    }
-                                }
-                                var bls = blockScore.GroupBy(x => x.subject).Select(v => new
-                                {
-                                    subjectId = v.Key,
-                                    knoScore = v.ToList().GroupBy(k => k.name).Select(z => new
-                                    {
-                                        knoName = z.Key,
-                                        score = z.ToList().Sum(j => j.score),
-                                        aver = z.ToList().Sum(j => j.aver)
-                                    })
-                                });
-                                //List<(string subId,List<(string name, List<string> kno)>)> subjectKnow = knoledge.Select(x => new { x.subId, x.knos }).ToList();
-                                //var subjectKnow;
-                                var subjectKnow = string.IsNullOrEmpty(exams[0].papers[0].periodId) ? knoledge.Select(x => new { x.subId, x.knos }).ToList() : knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
-                                /*if (string.IsNullOrEmpty(exams[0].papers[0].periodId))
-                                {
-                                    var subjectKnow = knoledge.Select(x => new { x.subId, x.knos }).ToList();
-                                }
-                                else {
-                                    var subjectKnow = knoledge.Where(c => c.ptype.Equals(art.periodType)).Select(x => new { x.subId, x.knos }).ToList();
-                                }*/
-                                List<(string subjectId, List<(string name, double score, double persent, double aver, List<string> dim)> bks)> bs = new();
-                                List<(string subjectId, List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks)> sbs = new();
-                                List<(string name, double score, double av, string sId)> stuBlockScore = new();
-                                foreach (var bb in subjectKnow)
-                                {
-                                    var kno1 = bls.Where(c => c.subjectId.Equals(bb.subId)).SelectMany(x => x.knoScore).ToList();
-                                    var stuInfo = studentScores.Select(c => new
-                                    {
-                                        c.stuId,
-                                        subInfo = c.studentScore.Where(x => x.subject.Equals(bb.subId)).ToList()
-                                    }).Where(z => z.subInfo.Count > 0).ToList();
-                                    //var kno2 = dimensions.Where(c => c.subjectBind.Equals(bb.subId)).Select(x => new { x.dimension,x.blocks}).ToList();
-                                    List<(string name, double score, double aver)> blockScores = new();
-                                    foreach (var k2 in bb.knos)
-                                    {
-                                        double bsc = 0;
-                                        double avs = 0;
-                                        foreach (var k3 in kno1)
+                                            blockScores.Add((k2.name, bsc, avs));
+                                        }
+
+
+                                        var stuBlock = stuBlockScore.GroupBy(x => (x.sId)).Select(c => new
                                         {
-                                            if (null != k2.kno && k2.kno.Contains(k3.knoName))
+                                            stuId = c.Key,
+                                            block = c.ToList().GroupBy(b => b.name).Select(q => new
                                             {
-                                                bsc += k3.score;
-                                                avs += k3.aver;
-                                            }
+                                                name = q.Key,
+                                                score = q.ToList().Sum(q => q.score),
+                                                point = q.ToList().Sum(q => q.av),
+                                                dimension = setting.dimensions.Where(s => s.blocks.Contains(q.Key)).Select(x => x.dimension).ToList()
+                                            })
+                                        }).ToList();
+                                        var blk = blockScores.Select(x => new
+                                        {
+                                            x.name,
+                                            x.score,
+                                            persent = Math.Round(x.aver > 0 ? x.aver / x.score : 0, 2),
+                                            x.aver,
+                                            dimension = setting.dimensions.Where(s => s.blocks.Contains(x.name)).Select(x => x.dimension)
+                                        });
+                                        List<(string name, double score, double persent, double aver, List<string> dim)> bks = new();
+                                        List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks = new();
+                                        foreach (var bk in blk)
+                                        {
+                                            bks.Add((bk.name, bk.score, bk.persent, bk.aver, bk.dimension.ToList()));
                                         }
-                                        foreach (var stu in stuInfo)
+                                        foreach (var stuBlk in stuBlock)
                                         {
-                                            double realScore = 0;
-                                            double realPoint = 0;
-                                            foreach (var subScore in stu.subInfo)
+                                            List<(string name, double score, double point, List<string> dim)> values = new();
+                                            foreach (var lk in stuBlk.block)
                                             {
-                                                if (null != k2.kno && k2.kno.Contains(subScore.name))
-                                                {
-                                                    realScore = subScore.score;
-                                                    realPoint = subScore.point;
-                                                }                                             
+                                                values.Add((lk.name, lk.score, lk.point, lk.dimension));
                                             }
-                                            stuBlockScore.Add((k2.name, realScore, realPoint, stu.stuId));
+                                            stuBks.Add((stuBlk.stuId, values));
                                         }
-                                        blockScores.Add((k2.name, bsc, avs));
+                                        bs.Add((bb.subId, bks));
+                                        sbs.Add((bb.subId, stuBks));
                                     }
 
-
-                                    var stuBlock = stuBlockScore.GroupBy(x => (x.sId)).Select(c => new
+                                    var blocks = bs.Select(x => new
                                     {
-                                        stuId = c.Key,
-                                        block = c.ToList().GroupBy(b => b.name).Select(q => new
+                                        x.subjectId,
+                                        dim = x.bks.Select(z => new
                                         {
-                                            name = q.Key,
-                                            score = q.ToList().Sum(q => q.score),
-                                            point = q.ToList().Sum(q => q.av),
-                                            dimension = setting.dimensions.Where(s => s.blocks.Contains(q.Key)).Select(x => x.dimension).ToList()
+                                            z.name,
+                                            z.score,
+                                            z.persent,
+                                            z.aver,
+                                            z.dim
                                         })
-                                    }).ToList() ;
-                                    var blk = blockScores.Select(x => new
-                                    {
-                                        x.name,
-                                        x.score,
-                                        persent = Math.Round(x.aver > 0 ? x.aver / x.score : 0, 2),
-                                        x.aver,
-                                        dimension = setting.dimensions.Where(s => s.blocks.Contains(x.name)).Select(x => x.dimension)
                                     });
-                                    List<(string name, double score, double persent, double aver, List<string> dim)> bks = new();
-                                    List<(string stuId, List<(string name, double score, double point, List<string> dim)> values)> stuBks = new();
-                                    foreach (var bk in blk)
-                                    {
-                                        bks.Add((bk.name, bk.score, bk.persent, bk.aver, bk.dimension.ToList()));
-                                    }
-                                    foreach (var stuBlk in stuBlock) {
-                                        List<(string name, double score, double point, List<string> dim)> values = new();
-                                        foreach (var lk in stuBlk.block) {
-                                            values.Add((lk.name,lk.score,lk.point,lk.dimension));
-                                        }
-                                        stuBks.Add((stuBlk.stuId, values));
-                                    }
-                                    bs.Add((bb.subId, bks));
-                                    sbs.Add((bb.subId, stuBks));
-                                }
-
-                                var blocks = bs.Select(x => new
-                                {
-                                    x.subjectId,
-                                    dim = x.bks.Select(z => new
-                                    {
-                                        z.name,
-                                        z.score,
-                                        z.persent,
-                                        z.aver,
-                                        z.dim
-                                    })
-                                });
-                                var stuBlocks = sbs.Select(x => new { 
-                                    x.subjectId,
-                                    dim = x.stuBks.Select(z => new { 
-                                        z.stuId,
-                                        blk = z.values.Select(c => new { 
-                                            c.name,
-                                            c.score,
-                                            c.point,
-                                            c.dim
+                                    var stuBlocks = sbs.Select(x => new {
+                                        x.subjectId,
+                                        dim = x.stuBks.Select(z => new {
+                                            z.stuId,
+                                            blk = z.values.Select(c => new {
+                                                c.name,
+                                                c.score,
+                                                c.point,
+                                                c.dim
+                                            })
                                         })
-                                    })
-                                });
-                                //获取维度得分率
-                                var dim = setting.dimensions.GroupBy(a => a.subjectBind).Select(x => new
-                                {
-                                    x.Key,
-                                    dim = x.ToList().Select(c => new
+                                    });
+                                    //获取维度得分率
+                                    var dim = setting.dimensions.GroupBy(a => a.subjectBind).Select(x => new
                                     {
-                                        c.dimension,
-                                        persent = Math.Round(c.blocks.Select(z => new
+                                        x.Key,
+                                        dim = x.ToList().Select(c => new
                                         {
-                                            persent = Math.Round(bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) > 0 ?
-                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.aver) /
-                                            bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) : 0, 2)
-                                        }).Sum(o => o.persent) / c.blocks.Count, 2)
-                                    })
-                                });
+                                            c.dimension,
+                                            persent = Math.Round(c.blocks.Select(z => new
+                                            {
+                                                persent = Math.Round(bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) > 0 ?
+                                                bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.aver) /
+                                                bs.Where(z => z.subjectId.Equals(x.Key)).SelectMany(k => k.bks).Where(q => q.name.Equals(z)).Sum(h => h.score) : 0, 2)
+                                            }).Sum(o => o.persent) / c.blocks.Count, 2)
+                                        })
+                                    });
 
-                                //获取学期信息
+                                    //获取学期信息
 
-                                var (currSemester, studyYear, currSemesterDate, date, nextSemester) = SchoolService.GetSemester(period, art.startTime);
-                                //总分的占比情况
+                                    var (currSemester, studyYear, currSemesterDate, date, nextSemester) = SchoolService.GetSemester(period, art.startTime);
+                                    //总分的占比情况
 
-                                foreach (var rs in studentArtResults)
-                                {
-                                    foreach (var res in rs.results)
+                                    foreach (var rs in studentArtResults)
                                     {
-                                        if (res.quotaId.Equals("quota_21") && res.score > -1 && res.score < 95)
+                                        foreach (var res in rs.results)
                                         {
-                                            /*res.score *= 1.5;
-                                            if (res.score >= 95) {
-                                                res.score = new Random().Next(90, 99);
-                                            }*/
-                                            //res.score = Math.Round(res.score);
+                                            if (res.quotaId.Equals("quota_21") && res.score > -1 && res.score < 95)
+                                            {
+                                                /*res.score *= 1.5;
+                                                if (res.score >= 95) {
+                                                    res.score = new Random().Next(90, 99);
+                                                }*/
+                                                //res.score = Math.Round(res.score);
+                                            }
                                         }
-                                    }
 
-                                    //if (rs.totalScore == 0)
-                                    //{
-                                    foreach (var sc in rs.subjectScores)
-                                    {
-                                        //if (sc.score == 0)
+                                        //if (rs.totalScore == 0)
                                         //{
-                                        /* var subjectMore = rs.results.GroupBy(x => x.subjectId).Select(c => new { subject = c.Key, list = c.ToList().Select(m => new { m.quotaId,m.score}) });
-                                         var totalScore = subjectMore.Select(x => new { 
-                                             x.subject,
-                                             quotaScroe =  x.list.Select(c => new {
-                                                 c.quotaId,
-                                                 c.score
-                                             }),
-                                         });*/
-                                        var quotaPercent = setting.quotas.Select(x => new
+                                        foreach (var sc in rs.subjectScores)
                                         {
-                                            x.id,
-                                            x.percent,
-                                            score = x.children.Select(c => new
+                                            //if (sc.score == 0)
+                                            //{
+                                            /* var subjectMore = rs.results.GroupBy(x => x.subjectId).Select(c => new { subject = c.Key, list = c.ToList().Select(m => new { m.quotaId,m.score}) });
+                                             var totalScore = subjectMore.Select(x => new { 
+                                                 x.subject,
+                                                 quotaScroe =  x.list.Select(c => new {
+                                                     c.quotaId,
+                                                     c.score
+                                                 }),
+                                             });*/
+                                            var quotaPercent = setting.quotas.Select(x => new
                                             {
-                                                real = rs.results.Where(r => r.quotaId.Equals(c.id) && r.subjectId.Equals(sc.subjectId) && r.score > -1).FirstOrDefault()?.score * c.percent * 0.01,
-                                                score = c.children.Select(s => new
+                                                x.id,
+                                                x.percent,
+                                                score = x.children.Select(c => new
                                                 {
-                                                    real = rs.results.Where(r => r.quotaId.Equals(s.id) && r.subjectId.Equals(sc.subjectId) && r.score > -1).FirstOrDefault()?.score * s.percent * 0.01
-                                                }).Sum(n => n.real) * c.percent * 0.01
-                                            }).Sum(n => n.real + n.score) * x.percent * 0.01
-                                        });
-                                        double realScore = Math.Round((double)quotaPercent.Sum(c => c.score), 2);
-                                        sc.score = realScore;
-                                        //}
-                                    }
-                                    rs.totalScore = Math.Round(rs.subjectScores.Where(m => m.score >= 0).Sum(z => z.score), 2);
-                                    tasks.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(rs, rs.id, new PartitionKey(rs.code)));
+                                                    real = rs.results.Where(r => r.quotaId.Equals(c.id) && r.subjectId.Equals(sc.subjectId) && r.score > -1).FirstOrDefault()?.score * c.percent * 0.01,
+                                                    score = c.children.Select(s => new
+                                                    {
+                                                        real = rs.results.Where(r => r.quotaId.Equals(s.id) && r.subjectId.Equals(sc.subjectId) && r.score > -1).FirstOrDefault()?.score * s.percent * 0.01
+                                                    }).Sum(n => n.real) * c.percent * 0.01
+                                                }).Sum(n => n.real + n.score) * x.percent * 0.01
+                                            });
+                                            double realScore = Math.Round((double)quotaPercent.Sum(c => c.score), 2);
+                                            sc.score = realScore;
+                                            //}
+                                        }
+                                        rs.totalScore = Math.Round(rs.subjectScores.Where(m => m.score >= 0).Sum(z => z.score), 2);
+                                        tasks.Add(client.GetContainer(Constant.TEAMModelOS, Constant.Student).ReplaceItemAsync(rs, rs.id, new PartitionKey(rs.code)));
 
-                                    PortraitStudent student = new()
-                                    {
-                                        studentId = rs.studentId,
-                                        name = rs.studentName,
-                                        classId = rs.classIds[0]
-                                    };
-                                    SemesterData semesterData = new()
-                                    {
-                                        examName = art.name,
-                                        examId = art.id,
-                                        examDate = art.startTime,
-                                        examType = "",
-                                        year = studyYear,
-                                        semesterId = currSemester.id,
-                                        totalScore = 200,
-                                        sumScore = rs.totalScore,
-                                        excellenceRate = 0,
-                                        passRate = 0,
-                                    };
-                                    int index = 0;
-                                    foreach (var sj in art.subjects)
-                                    {
-                                        ItemScore item = new()
+                                        PortraitStudent student = new()
                                         {
-                                            name = sj.name,
-                                            score = rs.subjectScores.Where(x => x.subjectId.Equals(sj.id)).FirstOrDefault().score,
-                                            time = art.startTime,
-                                            totalScore = 100,
-                                            id = sj.id,  
-                                            type = sj.id,
-                                            block = stuBlocks.Where(c => c.subjectId.Equals(sj.id)).SelectMany(x => x.dim).Where(z => z.stuId.Equals(rs.studentId))?.FirstOrDefault().blk,
-                                            kno = studentScores.Where(c => c.stuId.Equals(rs.studentId)).SelectMany(c => c.studentScore).Where(
-                                                p => p.subject.Equals(sj.id)).Select(z => new
-                                                {
-                                                    z.name,
-                                                    z.score,
-                                                    z.point,
-                                                    block = subjectKnow.Where(v => v.subId.Equals(sj.id)).SelectMany(k => k.knos).Where(c => null != c.kno && c.kno.Contains(z.name)).Select(x => x.name)
-                                                }),
-                                            dim = dim.Where(c => c.Key.Equals(sj.id))?.FirstOrDefault().dim
+                                            studentId = rs.studentId,
+                                            name = rs.studentName,
+                                            classId = rs.classIds[0]
                                         };
-                                        index++;
-                                        semesterData.itemScore.Add(item);
-                                    }
-                                    student.semesterData.Add(semesterData);
+                                        SemesterData semesterData = new()
+                                        {
+                                            examName = art.name,
+                                            examId = art.id,
+                                            examDate = art.startTime,
+                                            examType = "",
+                                            year = studyYear,
+                                            semesterId = currSemester.id,
+                                            totalScore = 200,
+                                            sumScore = rs.totalScore,
+                                            excellenceRate = 0,
+                                            passRate = 0,
+                                        };
+                                        int index = 0;
+                                        foreach (var sj in art.subjects)
+                                        {
+                                            ItemScore item = new()
+                                            {
+                                                name = sj.name,
+                                                score = rs.subjectScores.Where(x => x.subjectId.Equals(sj.id)).FirstOrDefault().score,
+                                                time = art.startTime,
+                                                totalScore = 100,
+                                                id = sj.id,
+                                                type = sj.id,
+                                                block = stuBlocks.Where(c => c.subjectId.Equals(sj.id)).SelectMany(x => x.dim).Where(z => z.stuId.Equals(rs.studentId))?.FirstOrDefault().blk,
+                                                kno = studentScores.Where(c => c.stuId.Equals(rs.studentId)).SelectMany(c => c.studentScore).Where(
+                                                    p => p.subject.Equals(sj.id)).Select(z => new
+                                                    {
+                                                        z.name,
+                                                        z.score,
+                                                        z.point,
+                                                        block = subjectKnow.Where(v => v.subId.Equals(sj.id)).SelectMany(k => k.knos).Where(c => null != c.kno && c.kno.Contains(z.name)).Select(x => x.name)
+                                                    }),
+                                                dim = dim.Where(c => c.Key.Equals(sj.id))?.FirstOrDefault().dim
+                                            };
+                                            index++;
+                                            semesterData.itemScore.Add(item);
+                                        }
+                                        student.semesterData.Add(semesterData);
 
-                                    portrait.students.Add(student);
-                                    //}
-                                }
-                                if (tasks.Count > 0)
-                                {
-                                    await Task.WhenAll(tasks);
-                                }
-                                //获取学生信息
-                                //(List<RMember> rmembers, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, art.classes, art.school);
-                                /* foreach (var member in studentArtResults)
-                                 {                                
+                                        portrait.students.Add(student);
+                                        //}
+                                    }
+                                    if (tasks.Count > 0)
+                                    {
+                                        await Task.WhenAll(tasks);
+                                    }
+                                    //获取学生信息
+                                    //(List<RMember> rmembers, List<RGroupList> groups) = await GroupListService.GetMemberByListids(_coreAPIHttpService, client, _dingDing, art.classes, art.school);
+                                    /* foreach (var member in studentArtResults)
+                                     {                                
 
-                                 }*/
-                                if (null != period && persent >= 60)
-                                {
-                                    string location = $"{Environment.GetEnvironmentVariable("Option:Location")}";
-                                    var responseData = await _httpTrigger.RequestHttpTrigger(portrait, location, "upsert-student-portrait");
+                                     }*/
+                                    if (null != period && persent >= 60)
+                                    {
+                                        string location = $"{Environment.GetEnvironmentVariable("Option:Location")}";
+                                        var responseData = await _httpTrigger.RequestHttpTrigger(portrait, location, "upsert-student-portrait");
+                                    }
                                 }
+                            } catch (Exception e) {
+                                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-艺术评测finish{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
                             }
+                           /* finally
+                            {
+                                string pk = string.Format("{0}{1}{2}", art.code, "-", "going");
+                                await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+                            }*/
+                            
 
                             break;
                     }

+ 4 - 4
TEAMModelOS.FunctionV4/CosmosDB/TriggerExam.cs

@@ -393,9 +393,9 @@ namespace TEAMModelOS.FunctionV4
                             finally
                             {
                                 try {
-                                    //新增serviceBus 消息释放后处理table
+                                    /*//新增serviceBus 消息释放后处理table
                                     string pkey = string.Format("{0}{1}{2}", info.code, "-", "pending");
-                                    await table.DeleteSingle<ChangeRecord>(pkey, data.id);
+                                    await table.DeleteSingle<ChangeRecord>(pkey, data.id);*/
                                     // 发送信息通知
                                     var messageEnd = new ServiceBusMessage(new { id = data.id, progress = "finish", code = data.code }.ToJsonString());
                                     messageEnd.ApplicationProperties.Add("name", "Exam");
@@ -551,11 +551,11 @@ namespace TEAMModelOS.FunctionV4
                             {
                                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-{info.id}-评测finish状态异常{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
                             }
-                            finally {
+                           /* finally {
                                 //新增serviceBus 消息释放后处理table
                                 string pk = string.Format("{0}{1}{2}", info.code, "-", "going");
                                 await table.DeleteSingle<ChangeRecord>(pk, data.id);
-                            }
+                            }*/
                             break;
                     }
                 }

+ 59 - 42
TEAMModelOS.FunctionV4/CosmosDB/TriggerHomework.cs

@@ -103,64 +103,81 @@ namespace TEAMModelOS.FunctionV4
 
                             break;
                         case "going":
-                            string pkey = string.Format("{0}{1}{2}", work.code, "-", "pending");
-                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
-                            await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
-                            var messageWorkEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
-                            messageWorkEnd.ApplicationProperties.Add("name", "Homework");
-                            if (changeRecords.Count > 0)
-                            {
-                                long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                try
+                            try {
+                                await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
+                                var messageWorkEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
+                                messageWorkEnd.ApplicationProperties.Add("name", "Homework");
+                                if (changeRecords.Count > 0)
                                 {
-                                    await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                    long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
+                                    try
+                                    {
+                                        await _serviceBus.GetServiceBusClient().CancelMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), changeRecords[0].sequenceNumber);
+                                    }
+                                    catch (Exception)
+                                    {
+                                    }
+                                    changeRecords[0].sequenceNumber = end;
+                                    await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
                                 }
-                                catch (Exception)
+                                else
                                 {
+                                    long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
+                                    ChangeRecord changeRecord = new()
+                                    {
+                                        RowKey = tdata.id,
+                                        PartitionKey = PartitionKey,
+                                        sequenceNumber = end,
+                                        msgId = messageWorkEnd.MessageId
+                                    };
+                                    await table.Save<ChangeRecord>(changeRecord);
                                 }
-                                changeRecords[0].sequenceNumber = end;
-                                await table.SaveOrUpdate<ChangeRecord>(changeRecords[0]);
-                            }
-                            else
-                            {
-                                long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
-                                ChangeRecord changeRecord = new()
-                                {
-                                    RowKey = tdata.id,
-                                    PartitionKey = PartitionKey,
-                                    sequenceNumber = end,
-                                    msgId = messageWorkEnd.MessageId
-                                };
-                                await table.Save<ChangeRecord>(changeRecord);
+                            } catch (Exception e) {
+                                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修作业活动going{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
                             }
+                            /*finally {
+                                string pkey = string.Format("{0}{1}{2}", work.code, "-", "pending");
+                                await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
+                            }*/
+                            
+                            
                             //if (bustasks.IsNotEmpty())
                             //{
                             //    await Task.WhenAll(bustasks);
                             //}
                             break;
                         case "finish":
-                            string pk = string.Format("{0}{1}{2}", work.code, "-", "going");
-                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
-                            await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
-                            List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
-                            if (work.groupLists.Count > 0)
-                            {
-                                var group = work.groupLists;
-                                foreach (var gp in group)
+                            try {
+                                await Activity(_coreAPIHttpService, _serviceBus, _dingDing, client, _configuration, work);
+                                List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
+                                if (work.groupLists.Count > 0)
                                 {
-                                    foreach (KeyValuePair<string, List<string>> pp in gp)
+                                    var group = work.groupLists;
+                                    foreach (var gp in group)
                                     {
-                                        gls.Add((pp.Key, pp.Value));
+                                        foreach (KeyValuePair<string, List<string>> pp in gp)
+                                        {
+                                            gls.Add((pp.Key, pp.Value));
+                                        }
                                     }
                                 }
-                            }
-                            //处理家庭作业活动结束统计账户信息
-                            if (work.staffIds.Count == 0) {
-                                List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, work.school, work.classes, work.stuLists, work.tchLists,gls);
-                                work.staffIds = idsList;
+                                //处理家庭作业活动结束统计账户信息
+                                if (work.staffIds.Count == 0)
+                                {
+                                    List<FMember> idsList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, work.school, work.classes, work.stuLists, work.tchLists, gls);
+                                    work.staffIds = idsList;
+
+                                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Homework>(work, work.id, new Azure.Cosmos.PartitionKey(work.code));
+                                }
+                            } catch (Exception e) {
+                                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修作业活动finish{e.Message}\n{e.StackTrace}", GroupNames.醍摩豆服務運維群組);
 
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Homework>(work, work.id, new Azure.Cosmos.PartitionKey(work.code));
-                            }                          
+                            } /*finally {
+                                string pk = string.Format("{0}{1}{2}", work.code, "-", "going");
+                                await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+                            }*/
+                            
+                                                
                             break;
                     }
 

+ 41 - 25
TEAMModelOS.FunctionV4/CosmosDB/TriggerStudy.cs

@@ -107,9 +107,8 @@ namespace TEAMModelOS.FunctionV4
                             }
                             break;
                         case "going":
-                            string pkey = string.Format("{0}{1}{2}", study.code, "-", "pending");
-                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
-                            try {
+                            try
+                            {
                                 List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
                                 if (study.groupLists.Count > 0)
                                 {
@@ -126,8 +125,8 @@ namespace TEAMModelOS.FunctionV4
                                 List<StuActivity> tchActivities = new List<StuActivity>();
                                 (string standard, List<string> tmdids, string school, List<string> update, int statistics) list = (null, null, null, new List<string> { StatisticsService.OfflineRecord }, 0);
                                 if (tchList.IsNotEmpty())
-                                {                                  
-                                    list.tmdids = tchList.Select(x => x.id).ToList();                                    
+                                {
+                                    list.tmdids = tchList.Select(x => x.id).ToList();
                                     School school = null;
                                     if (!string.IsNullOrEmpty(study.school))
                                     {
@@ -183,14 +182,15 @@ namespace TEAMModelOS.FunctionV4
 
                                 }
                                 await IESActivityService.SaveStuActivity(client, _dingDing, null, null, tchActivities);
-                                await StatisticsService.SendServiceBus(list, _configuration, _serviceBus,client);
+                                await StatisticsService.SendServiceBus(list, _configuration, _serviceBus, client);
                                 var messageWorkEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
                                 messageWorkEnd.ApplicationProperties.Add("name", "Study");
-                                if ( study.teacIds != null && study.teacIds.Count == 0) {
+                                if (study.teacIds != null && study.teacIds.Count == 0)
+                                {
                                     study.teacIds = list.tmdids;
                                     await client.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync(study, study.id, new PartitionKey($"{study.code}"));
                                 }
-                               
+
                                 if (changeRecords.Count > 0)
                                 {
                                     long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageWorkEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
@@ -213,38 +213,54 @@ namespace TEAMModelOS.FunctionV4
                                         PartitionKey = PartitionKey,
                                         sequenceNumber = end,
                                         msgId = messageWorkEnd.MessageId
-                                    };                                   
+                                    };
                                     await table.Save<ChangeRecord>(changeRecord);
                                 }
 
                             }
-                            catch (Exception ex) {
+                            catch (Exception ex)
+                            {
                                 await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修活动异常-going {ex.Message}\n{ex.StackTrace}{tdata.ToJsonString()}{input}", GroupNames.醍摩豆服務運維群組);
                             }
+                            /*finally {
+                                string pk = string.Format("{0}{1}{2}", study.code, "-", "pending");
+                                await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+                            }*/
                            
                             break;
                         case "finish":
-                            string pk = string.Format("{0}{1}{2}", study.code, "-", "going");
-                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
-                            List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
-                            if (study.groupLists.Count > 0)
+                            try
                             {
-                                var group = study.groupLists;
-                                foreach (var gp in group)
+                                List<(string pId, List<string> gid)> gls = new List<(string pId, List<string> gid)>();
+                                if (study.groupLists.Count > 0)
                                 {
-                                    foreach (KeyValuePair<string, List<string>> pp in gp)
+                                    var group = study.groupLists;
+                                    foreach (var gp in group)
                                     {
-                                        gls.Add((pp.Key, pp.Value));
+                                        foreach (KeyValuePair<string, List<string>> pp in gp)
+                                        {
+                                            gls.Add((pp.Key, pp.Value));
+                                        }
                                     }
                                 }
-                            }
-                            //处理教研活动结束统计账户信息
-                            if (study.staffIds.Count == 0) {
-                                List<FMember> idList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, study.school, study.classes, study.stuLists, study.tchLists, gls);
-                                study.staffIds = idList;
-                                await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Study>(study, study.id, new Azure.Cosmos.PartitionKey(study.code));
+                                //处理教研活动结束统计账户信息
+                                if (study.staffIds.Count == 0)
+                                {
+                                    List<FMember> idList = await GroupListService.GetFinishMemberInfo(_coreAPIHttpService, client, _dingDing, study.school, study.classes, study.stuLists, study.tchLists, gls);
+                                    study.staffIds = idList;
+                                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Study>(study, study.id, new Azure.Cosmos.PartitionKey(study.code));
 
-                            }                         
+                                }
+
+                            }
+                            catch (Exception e)
+                            {
+                                await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}研修活动异常-finish {e.Message}\n{e.StackTrace}{tdata.ToJsonString()}{input}", GroupNames.醍摩豆服務運維群組);
+                            }
+                           /* finally {
+                                string pk = string.Format("{0}{1}{2}", study.code, "-", "going");
+                                await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+                            }*/
                             break;
                     }
                 }

+ 6 - 6
TEAMModelOS.FunctionV4/CosmosDB/TriggerSurvey.cs

@@ -110,9 +110,7 @@ namespace TEAMModelOS.FunctionV4
                                 await table.Save<ChangeRecord>(changeRecord);
                             }
                             break;
-                        case "going":
-                            string pkey = string.Format("{0}{1}{2}", survey.code, "-", "pending");
-                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
+                        case "going":                           
                             List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
                             if (survey.groupLists.Count > 0)
                             {
@@ -302,6 +300,8 @@ namespace TEAMModelOS.FunctionV4
 #endif                           
                             var messageSurveyEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
                             messageSurveyEnd.ApplicationProperties.Add("name", "Survey");
+                           /* string pkey = string.Format("{0}{1}{2}", survey.code, "-", "pending");
+                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);*/
                             if (changeRecords.Count > 0)
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageSurveyEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
@@ -333,8 +333,7 @@ namespace TEAMModelOS.FunctionV4
 #endif
                             break;
                         case "finish":
-                            string pk = string.Format("{0}{1}{2}", survey.code, "-", "going");
-                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+                            
 #if DEBUG
                             await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}问卷调查{tdata.id}开始结算{tdata.endTime}!", GroupNames.醍摩豆服務運維群組);
 #endif
@@ -476,7 +475,8 @@ namespace TEAMModelOS.FunctionV4
                                 _azureRedis.GetRedisClient(8).KeyDelete($"Survey:Submit:{survey.id}");
                                 break;
                             }
-
+                            /*string pk = string.Format("{0}{1}{2}", survey.code, "-", "going");
+                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);*/
                             //更新结束状态
                             //data.progress = "finish";
                             //if (survey.scope .Equals("school"))

+ 6 - 4
TEAMModelOS.FunctionV4/CosmosDB/TriggerVote.cs

@@ -106,8 +106,7 @@ namespace TEAMModelOS.FunctionV4
                             }
                             break;
                         case "going":
-                            string pk = string.Format("{0}{1}{2}", vote.code, "-", "pending");
-                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);
+
                             List<(string pId, List<string> gid)> ps = new List<(string pId, List<string> gid)>();
                             if (vote.groupLists.Count > 0)
                             {
@@ -305,6 +304,8 @@ namespace TEAMModelOS.FunctionV4
                             #endregion
                             var messageVoteEnd = new ServiceBusMessage(new { id = tdata.id, progress = "finish", code = tdata.code }.ToJsonString());
                             messageVoteEnd.ApplicationProperties.Add("name", "Vote");
+                           /* string pk = string.Format("{0}{1}{2}", vote.code, "-", "pending");
+                            await table.DeleteSingle<ChangeRecord>(pk, tdata.id);*/
                             if (voteRecords.Count > 0)
                             {
                                 long end = await _serviceBus.GetServiceBusClient().SendScheduleMessageAsync(Environment.GetEnvironmentVariable("Azure:ServiceBus:ActiveTask"), messageVoteEnd, DateTimeOffset.FromUnixTimeMilliseconds(tdata.endTime));
@@ -335,8 +336,7 @@ namespace TEAMModelOS.FunctionV4
 #endif
                             break;
                         case "finish":
-                            string pkey = string.Format("{0}{1}{2}", vote.code, "-", "going");
-                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);
+                           
 #if DEBUG
                             await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}投票活动{tdata.id}开始结算{tdata.endTime}!", GroupNames.醍摩豆服務運維群組);
 #endif
@@ -398,6 +398,8 @@ namespace TEAMModelOS.FunctionV4
                                 break;
                             }
                             await Task.WhenAll(tasks);
+                          /*  string pkey = string.Format("{0}{1}{2}", vote.code, "-", "going");
+                            await table.DeleteSingle<ChangeRecord>(pkey, tdata.id);*/
                             break;
                     }
                 }

+ 19 - 18
TEAMModelOS/Controllers/Third/IRS/ThirdIRSController.cs

@@ -144,7 +144,7 @@ namespace TEAMModelOS.Controllers
                                                 JsonElement json = content.ToObject<JsonElement>();
                                                 if (json.GetProperty("code").GetInt32()==0)
                                                 {
-                                                    await _dingDing.SendBotMsg($"139zhxy电子学生证任务推送成功。\n{json.GetProperty("message").GetString()}", GroupNames.成都开发測試群組);
+                                                    await _dingDing.SendBotMsg($"139zhxy电子学生证任务推送成功。\n{json.GetProperty("message").GetString()}{data.ToJsonString()}", GroupNames.成都开发測試群組);
                                                 }
                                                 else
                                                 {
@@ -180,6 +180,7 @@ namespace TEAMModelOS.Controllers
         [HttpPost("third-irs/receive-139zhxy")]
         public async Task<IActionResult> Receive_139zhxy(JsonElement json)
         {
+            await _dingDing.SendBotMsg($"收到,接收到 139zhxy反馈器推送信息!{json.ToJsonString()}\n", GroupNames.成都开发測試群組);
             string sign = string.Empty, timestamp = string.Empty, message="请求失败";
             int code = -1;
             long now =  DateTimeOffset.UtcNow.GetGMTTime(8).ToUnixTimeMilliseconds();
@@ -192,10 +193,10 @@ namespace TEAMModelOS.Controllers
                 {
                     timestamp= _timestamp.ToString();
                 }
-                if (!string.IsNullOrEmpty(sign)  && !string.IsNullOrWhiteSpace(timestamp))
-                {
-                    string local_sign = Md5Hash.Encrypt($"{AppID139zhxy}{AppKey139zhxy}{timestamp}");
-                    if (local_sign.Equals(sign))
+             //   if (!string.IsNullOrEmpty(sign)  && !string.IsNullOrWhiteSpace(timestamp))
+            //    {
+                 //   string local_sign = Md5Hash.Encrypt($"{AppID139zhxy}{AppKey139zhxy}{timestamp}");
+                //    if (local_sign.Equals(sign))
                     {
                         var result = json.ToObject<ZHXY139IRSResult>();
                         await _dingDing.SendBotMsg($"接收到 139zhxy反馈器推送信息!{json.ToJsonString()}\n", GroupNames.成都开发測試群組);
@@ -284,19 +285,19 @@ namespace TEAMModelOS.Controllers
                             await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:任务不存在!{json.ToJsonString()}", GroupNames.成都开发測試群組);
                         }
                     }
-                    else
-                    {
-                        code=2;
-                        message="签名验证失败!";
-                        await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:签名验证失败!{json.ToJsonString()}", GroupNames.成都开发測試群組);
-                    }
-                }
-                else
-                {
-                    code =1;
-                    message="签名或时间戳为空!";
-                    await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:签名或时间戳为空!{json.ToJsonString()}", GroupNames.成都开发測試群組);
-                }
+                    //else
+                //    {
+                    //    code=2;
+                     //   message="签名验证失败!";
+                     //   await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:签名验证失败!{json.ToJsonString()}", GroupNames.成都开发測試群組);
+                   // }
+             //   }
+            //    else
+              //  {
+                 //   code =1;
+                  //  message="签名或时间戳为空!";
+                 //   await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:签名或时间戳为空!{json.ToJsonString()}", GroupNames.成都开发測試群組);
+              //  }
             }
             catch (Exception ex) {
                 await _dingDing.SendBotMsg($"139zhxy反馈器推送IRS异常:代码异常!{json.ToJsonString()}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);