Ver código fonte

单条审核

yuanmingze 5 meses atrás
pai
commit
3c28259c8b

+ 17 - 0
src/api/serviceManagement/servicesToBeReviewed/index.js

@@ -43,3 +43,20 @@ export function getDrug2Avail(query) {
     params: query
   });
 }
+
+export function getTaskV2TokenApi(data) {
+  return request({
+    url: ' /admin/task/v2/token',
+    method: 'post',
+    data: data
+  });
+}
+
+// 单条审核
+export function checkSingleApi(data) {
+  return request({
+    url: ' /admin/task/v2/check/single',
+    method: 'post',
+    data: data
+  });
+}

+ 174 - 0
src/views/serviceManagement/quickReview/index.vue

@@ -0,0 +1,174 @@
+<template>
+  <basic-container>
+    <div class="search-content">
+      <el-form :model="searchFrom" label-width="140px">
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="执行包年度">
+              <el-date-picker clearable class="w100" v-model="searchFrom.year" type="year" placeholder="请选择执行包年度" format="yyyy" value-format="yyyy"> </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="执行包季度">
+              <el-select v-model="searchFrom.quarter" placeholder="请选择服务季度" class="w100" clearable>
+                <el-option label="第一季度" :value="1"></el-option>
+                <el-option label="第二季度" :value="2"></el-option>
+                <el-option label="第三季度" :value="3"></el-option>
+                <el-option label="第四季度" :value="4"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="服务提交时间">
+              <el-date-picker class="w100" clearable v-model="searchFrom.createTime" type="date" placeholder="选择日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="服务类型">
+              <el-select v-model="searchFrom.taskTypeId" placeholder="请选择服务类型" class="w100" clearable>
+                <el-option :label="item.name" :value="item.id" v-for="item in taskTypeAvailArr" :key="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="服务提供商">
+              <el-select v-model="searchFrom.vendorId" placeholder="请选择服务提供商" class="w100" clearable filterable>
+                <el-option v-for="item in deptListArr" :key="item.entId" :label="item.name" :value="item.entId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="推广员姓名">
+              <el-select v-model="searchFrom.salesId" placeholder="请选择推广员姓名" class="w100" clearable filterable>
+                <el-option v-for="item in userListArr" :key="item.userId" :label="item.realName" :value="item.userId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="产品所属生产企业">
+              <el-select v-model="searchFrom.mahName" @change="mahNameChange" placeholder="请选择产品所属生产企业" class="w100" clearable>
+                <el-option v-for="item in mahNameArr" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="关联产品名称">
+              <el-select v-model="searchFrom.skuId" placeholder="请选择关联产品名称" class="w100" :disabled="drugDisabled" clearable filterable>
+                <el-option v-for="item in currDrugList" :key="item.id" :label="item.drugName" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="6">
+            <el-form-item label="执行包所属省份">
+              <el-select v-model="searchFrom.provAbbr" placeholder="请选择省份" class="w100" clearable>
+                <el-option v-for="province in abbreviationsProvincesList" :key="province" :label="province" :value="province" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="2">
+            <div class="search-btns">
+              <el-button type="success" @click="clickBtn">搜索</el-button>
+              <el-button @click="clearSearch">清空</el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+  </basic-container>
+</template>
+
+<script>
+import { getTaskV2PageApi, getTaskTypeAvailApi, getDeptv2Avail, getDrug2Avail, getUserV2Avail, getTaskV2TokenApi } from '@/api/serviceManagement/servicesToBeReviewed/index.js';
+import { getDictType } from '@/api/common';
+import abbreviationsProvinces from '@/const/abbreviationsProvinces.js';
+import dayjs from 'dayjs';
+
+export default {
+  data() {
+    return {
+      taskStatusArr: [],
+      taskTypeAvailArr: [],
+      mahNameArr: [],
+      deptListArr: [],
+      drugListArr: [],
+      userListArr: [],
+      currDrugList: [],
+      drugDisabled: true,
+      abbreviationsProvincesList: abbreviationsProvinces,
+      nodeId: '',
+      searchFrom: {
+        year: '2024',
+        taskTypeId: '',
+        quarter: '4',
+        createTime: '',
+        provAbbr: '',
+        mahName: '',
+        vendorId: '',
+        salesId: '',
+        skuId: '',
+        taskStatus: 3
+      }
+    };
+  },
+  created() {
+    this.getDict();
+  },
+  methods: {
+    getDict() {
+      getDictType({ type: 'task_status' }).then((res) => {
+        this.taskStatusArr = res.data.data;
+      });
+      getDictType({ type: 'mah_name' }).then((res) => {
+        this.mahNameArr = res.data.data;
+      });
+      getTaskTypeAvailApi().then((res) => {
+        this.taskTypeAvailArr = res.data.data;
+      });
+      getDeptv2Avail().then((res) => {
+        this.deptListArr = res.data.data;
+      });
+      getUserV2Avail().then((res) => {
+        this.userListArr = res.data.data;
+      });
+
+      getDrug2Avail().then((res) => {
+        this.drugListArr = res.data.data;
+      });
+    },
+    getList() {},
+    clickBtn() {
+      this.tableData = [];
+      this.page.currentPage = 1;
+      this.getList();
+    },
+    clearSearch() {
+      this.searchFrom = {
+        year: '',
+        taskTypeId: '',
+        quarter: '',
+        createTime: '',
+        provAbbr: '',
+        mahName: '',
+        vendorId: '',
+        salesId: '',
+        skuId: '',
+        taskStatus: 3
+      };
+      this.searchFrom.nodeId = this.nodeId;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.search-btns {
+  margin-left: 50px;
+  display: flex;
+  justify-content: space-between;
+}
+</style>

+ 6 - 89
src/views/serviceManagement/servicesToBeReviewed/components/TaskDetail.vue

@@ -25,13 +25,6 @@
             <div class="desc-value">
               {{ wmTaskContent[item.taskFiledKey] || '--' }}
             </div>
-            <!-- 用temp17存储打卡图片 -->
-            <div v-if="item.taskFiledType == 'mapwithimg' && !!wmTaskContent['temp17']" class="location-img">
-              <div class="field-text">位置打卡图片</div>
-              <div class="img-box">
-                <el-image class="img-item" :src="baseUrl + wmTaskContent['temp17']" :preview-src-list="getPreviewList([baseUrl + wmTaskContent['temp17']], 0)"> </el-image>
-              </div>
-            </div>
           </template>
           <!-- 时间 -->
           <template v-if="item.taskFiledType == 'datetime'">
@@ -47,31 +40,11 @@
               {{ wmTaskContent[item.taskFiledKey] }}
             </div>
           </template>
-          <!-- 签名 -->
-          <div v-if="item.taskFiledType == 'sign'" class="divline" style="width: 100%; height: 15px; background-color: #e9e9e9; margin-bottom: 5px"></div>
-          <template v-if="item.taskFiledType == 'sign'">
-            <div class="upload-field">
-              <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
-              <!-- 上传组件 -->
-              <div class="img-box">
-                <el-image
-                  :key="index"
-                  class="img-item"
-                  :src="baseUrl + wmTaskContent[item.taskFiledKey]"
-                  :preview-src-list="getPreviewList([baseUrl + wmTaskContent[item.taskFiledKey]], 0)"
-                >
-                </el-image>
-              </div>
-            </div>
-          </template>
           <!-- 图片上传 -->
           <div v-if="item.taskFiledType == 'img'" class="divline" style="width: 100%; height: 15px; background-color: #e9e9e9; margin-bottom: 5px"></div>
           <template v-if="item.taskFiledType == 'img'">
             <div class="upload-field">
-              <div class="field-text" :class="{ required: item.isMustfill == '1' }">
-                {{ item.taskFiledValue }}:
-                <!-- {{ getImgList(wmTaskContent[item.taskFiledKey], item) }} -->
-              </div>
+              <div class="field-text" :class="{ required: item.isMustfill == '1' }">{{ item.taskFiledValue }}:</div>
               <!-- 上传组件 -->
               <div class="img-box" v-if="item.imgList">
                 <div v-for="(iItem, index) in item.imgList" :key="index" class="img-box-content">
@@ -81,44 +54,6 @@
               </div>
             </div>
           </template>
-          <!-- 文件类型 -->
-          <template v-if="item.taskFiledType === 'fileurl'">
-            <div class="upload-field">
-              <div class="field-text" :class="{ required: item.isMustfill == '1' }">
-                {{ item.taskFiledValue }}:
-                {{ getFileList(wmTaskContent[item.taskFiledKey], item) }}
-              </div>
-              <div v-if="item.fileList" class="pl60 pr60">
-                <!-- 图片文件 -->
-                <div class="img-box">
-                  <template v-for="(iItem, index) in item.fileList">
-                    <el-image
-                      v-if="imgTypeList.includes(iItem.url.split('.')[1])"
-                      :key="index"
-                      class="img-item"
-                      :src="iItem.url"
-                      :preview-src-list="
-                        getPreviewList(
-                          item.fileList.map((ele) => ele.url),
-                          index
-                        )
-                      "
-                    >
-                    </el-image>
-                  </template>
-                </div>
-                <!-- 其他文件 -->
-                <div class="file-box">
-                  <template v-for="(iItem, index) in item.fileList">
-                    <div v-if="!imgTypeList.includes(iItem.url.split('.')[1])" :key="index" class="df_sb file-item">
-                      <span>{{ iItem.fileName }}</span>
-                      <span @click="downloadFn(iItem)">下载</span>
-                    </div>
-                  </template>
-                </div>
-              </div>
-            </div>
-          </template>
           <!-- 金额 -->
           <template v-if="item.taskFiledType == 'money'">
             <div class="title-value">{{ item.taskFiledValue }}:</div>
@@ -168,11 +103,6 @@ export default {
       imgTypeList: ['jpeg', 'jpg', 'png', 'git', 'bmp'] // 能查看的文件类型
     };
   },
-  props: {
-    id: {
-      type: String
-    }
-  },
 
   methods: {
     // 获取地址
@@ -283,22 +213,6 @@ export default {
       return [imgList, previewList];
     },
 
-    // 得出文件 jsonStr: temp字符串
-    getFileList(jsonStr, item) {
-      if (item.taskFiledType !== 'fileurl') return '';
-      if (!jsonStr) return '';
-      const parseFileList = JSON.parse(jsonStr);
-      if (!parseFileList) return '';
-      let fileList = [];
-      parseFileList.forEach((fileItem) => {
-        fileList.push({
-          fileName: fileItem.fileName,
-          url: process.env.VUE_APP_URL + fileItem.url
-        });
-      });
-      item.fileList = parseFileList;
-      return '';
-    },
     // 下载文件
     downloadFn(item) {
       request({
@@ -350,16 +264,19 @@ export default {
       } catch (e) {
         console.log(e);
       }
-      this.getMapAddress();
+      // this.getMapAddress();
       // uni.hideLoading();
     },
     getPreviewList(imgList, index) {
       // 解决el-image大图预览定位图片不准确的问题
       return imgList.slice(index).concat(imgList.slice(0, index));
+    },
+    getInfo(id) {
+      this.getTaskInfoById(id);
     }
   },
   mounted() {
-    this.getTaskInfoById(this.id);
+    //
   }
 };
 </script>

+ 154 - 35
src/views/serviceManagement/servicesToBeReviewed/index.vue

@@ -80,6 +80,10 @@
       </el-form>
     </div>
 
+    <div class="check-btns" v-if="false">
+      <el-button type="primary" @click="allClick">批量审核</el-button>
+      <el-button type="primary" @click="quickAuditClick">快捷审核</el-button>
+    </div>
     <div class="tips">当前选择表格已选择{{ totalNum }}项,总积分:{{ totalScore }}</div>
 
     <div class="table">
@@ -109,7 +113,7 @@
         <vxe-table-column field="taskScore" title="服务分值" width="100"></vxe-table-column>
         <vxe-table-column field="salesName" title="推广员姓名" width="150"></vxe-table-column>
         <vxe-table-column field="createTime" title="服务提交时间" width="200"></vxe-table-column>
-        <vxe-table-column field="taskStatusName" title="服务当前状态" width="120"></vxe-table-column>
+        <vxe-table-column field="checkResultName" title="服务当前状态" width="120"></vxe-table-column>
         <vxe-table-column field="entName" title="服务提供商" width="200"></vxe-table-column>
         <vxe-table-column field="mahName" title="产品所属生产企业" width="200"></vxe-table-column>
         <vxe-table-column field="skuName" title="关联产品名称" width="200"></vxe-table-column>
@@ -136,49 +140,57 @@
     </vxe-pager>
 
     <!-- 审核弹窗 -->
-
     <el-dialog title="审核" :close-on-click-modal="false" :visible.sync="reviewDialog" top="12vh" width="50%" :before-close="handleClose" center>
       <div class="reviewContent">
-        <div class="review-detail">
+        <div class="check-tips">审核令牌有效期为3分钟,请在【{{ expireTime }}】前完成审核操作,如果失效,请重新打开弹窗。</div>
+        <div class="review-detail" v-if="singleFlag">
           <div class="teskDetailsty">服务详情</div>
-          <TaskDetail :id="examineVal" />
+          <TaskDetail ref="taskDetailRef" :id="currentTaskId" />
         </div>
         <div class="teskDetailsty">审批意见</div>
         <el-form :model="taskForm" :rules="rules" ref="taskForm" label-width="100px">
-          <el-form-item label="审批意见:" prop="taskStatus" class="formitem-box">
-            <el-radio-group v-model="taskForm.taskStatus">
-              <el-radio label="3">通过</el-radio>
-              <el-radio label="4">拒绝</el-radio>
+          <el-form-item label="审批意见:" prop="checkResult" class="formitem-box">
+            <el-radio-group v-model="taskForm.checkResult">
+              <el-radio :label="true">通过</el-radio>
+              <el-radio :label="false">拒绝</el-radio>
             </el-radio-group>
           </el-form-item>
 
           <el-form-item
             label="意见说明:"
-            prop="taskStatusInfo"
+            prop="checkMessage"
             class="formitem-box"
             :rules="[
               {
-                required: taskForm.taskStatus == 3 ? false : true,
+                required: !taskForm.checkResult,
                 message: '请输入审批说明',
                 trigger: 'blur'
               }
             ]"
           >
-            <el-input type="textarea" v-model="taskForm.taskStatusInfo"></el-input>
+            <el-input type="textarea" v-model="taskForm.checkMessage"></el-input>
           </el-form-item>
           <refuseReason @selectRefuseReason="selectRefuseReason" />
         </el-form>
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button @click="handleClose">取 消</el-button>
-        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
+        <el-button type="primary" @click="checkForm">确 定</el-button>
       </span>
     </el-dialog>
   </basic-container>
 </template>
 
 <script>
-import { getTaskV2PageApi, getTaskTypeAvailApi, getDeptv2Avail, getDrug2Avail, getUserV2Avail } from '@/api/serviceManagement/servicesToBeReviewed/index.js';
+import {
+  getTaskV2PageApi,
+  getTaskTypeAvailApi,
+  getDeptv2Avail,
+  getDrug2Avail,
+  getUserV2Avail,
+  getTaskV2TokenApi,
+  checkSingleApi
+} from '@/api/serviceManagement/servicesToBeReviewed/index.js';
 import { tableOptin } from './index.js';
 import { getDictType } from '@/api/common';
 import abbreviationsProvinces from '@/const/abbreviationsProvinces.js';
@@ -186,15 +198,16 @@ import dayjs from 'dayjs';
 import { mapGetters } from 'vuex';
 import TaskDetail from './components/TaskDetail.vue';
 import refuseReason from '@/components/refuseReason';
+import Config from '@/settings';
 
 export default {
-  components: { TaskDetail, refuseReason, TaskDetail },
+  components: { refuseReason, TaskDetail },
   data() {
     return {
       tableOptin,
       tableData: [],
       tableLoading: false,
-      taskStatusArr: [],
+      checkResultArr: [],
       taskTypeAvailArr: [],
       mahNameArr: [],
       deptListArr: [],
@@ -205,9 +218,9 @@ export default {
       abbreviationsProvincesList: abbreviationsProvinces,
       nodeId: '',
       searchFrom: {
-        year: '2024',
+        year: '',
         taskTypeId: '',
-        quarter: '4',
+        quarter: '',
         createTime: '',
         provAbbr: '',
         mahName: '',
@@ -226,14 +239,17 @@ export default {
       },
       reviewDialog: false,
       taskForm: {
-        taskStatus: '',
-        taskStatusInfo: ''
+        checkResult: '',
+        checkMessage: ''
       },
       rules: {
-        taskStatus: [{ required: true, message: '请选择审批意见', trigger: 'change' }]
+        checkResult: [{ required: true, message: '请选择审批意见', trigger: 'change' }]
       },
       singleFlag: false,
-      examineVal: ''
+      checkIds: [],
+      currentTaskId: '',
+      reviewToken: '',
+      expireTime: ''
     };
   },
   computed: {
@@ -246,7 +262,7 @@ export default {
     const roles = this.userInfo.roles;
 
     let nodeId = '';
-    switch (roles) {
+    switch (true) {
       // 43	地市管理员
       case roles.includes(43):
         nodeId = 1;
@@ -276,7 +292,7 @@ export default {
     }
 
     const currentYear = dayjs().format('YYYY');
-    // this.searchFrom.year = currentYear;
+    this.searchFrom.year = currentYear;
     this.nodeId = nodeId;
     this.searchFrom.nodeId = nodeId;
     this.getList();
@@ -285,7 +301,7 @@ export default {
   methods: {
     getDict() {
       getDictType({ type: 'task_status' }).then((res) => {
-        this.taskStatusArr = res.data.data;
+        this.checkResultArr = res.data.data;
       });
       getDictType({ type: 'mah_name' }).then((res) => {
         this.mahNameArr = res.data.data;
@@ -319,9 +335,9 @@ export default {
         this.tableData = res.data.data.records;
         this.tableData.forEach((item) => {
           const currA = this.taskTypeAvailArr.find((itn) => itn.id === item.taskTypeId);
-          const currB = this.taskStatusArr.find((itn) => itn.value === item.taskStatus);
+          const currB = this.checkResultArr.find((itn) => itn.value === item.taskStatus);
           item.taskTypeName = currA?.name ?? '';
-          item.taskStatusName = currB?.label ?? '';
+          item.checkResultName = currB?.label ?? '';
           item.cycle = item.pkgStartTime + '~' + item.pkgEndTime;
         });
         this.page.total = res.data.data.total;
@@ -348,7 +364,6 @@ export default {
       this.searchFrom.nodeId = this.nodeId;
     },
     pageChange(obj) {
-      console.log('obj', obj);
       this.page.currentPage = obj.currentPage;
       this.page.pageSize = obj.pageSize;
       this.getList();
@@ -367,6 +382,7 @@ export default {
     },
     selectAllChangeEvent(obj) {
       const records = obj.selection;
+      this.checkIds = records.map((item) => item.taskId);
       this.totalNum = records.length;
       this.totalScore = records.reduce((pre, cur) => {
         return pre + (Number(cur.taskScore) || 0);
@@ -374,6 +390,7 @@ export default {
     },
     selectChangeEvent(obj) {
       const records = obj.selection;
+      this.checkIds = records.map((item) => item.taskId);
       this.totalNum = records.length;
       this.totalScore = records.reduce((pre, cur) => {
         return pre + (Number(cur.taskScore) || 0);
@@ -382,27 +399,116 @@ export default {
 
     selectRefuseReason(refuseReason) {
       let info;
-      if (this.taskForm.taskStatusInfo) {
-        info = this.taskForm.taskStatusInfo + refuseReason + ';';
+      if (this.taskForm.checkMessage) {
+        info = this.taskForm.checkMessage + refuseReason + ';';
       } else {
         info = refuseReason + ';';
       }
 
-      this.$set(this.taskForm, 'taskStatusInfo', info);
+      this.$set(this.taskForm, 'checkMessage', info);
     },
-    reviewBtn(row) {
-      console.log('row', row);
-      this.singleFlag = true;
-      this.examineVal = row.taskId;
+    async reviewBtn(row) {
+      this.currentTaskId = row.taskId;
+      const tokenRes = await getTaskV2TokenApi({ taskIds: [row.taskId] });
+      if (tokenRes.data.code !== 0 || !tokenRes.data.data?.token) {
+        return this.$message.error('获取token失败');
+      }
+      this.reviewToken = tokenRes.data.data.token;
+      this.expireTime = tokenRes.data.data.expireTime;
       this.reviewDialog = true;
+      this.singleFlag = true;
+
+      this.$nextTick(() => {
+        this.$refs.taskDetailRef.getInfo(row.taskId);
+      });
+    },
+    handleClose() {
+      this.reviewDialog = false;
+      this.taskForm = {
+        checkResult: '',
+        checkMessage: ''
+      };
+      this.currentTaskId = '';
     },
-    handleClose() {},
     serviceDetail(row) {
       window.open(
         Config.outsideUrl + '/h5/#/pages/task/task-detail/index?id=' + row.taskId,
         'newwindow',
         'height=500, width=400, top=200, left=300, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no'
       );
+    },
+
+    checkForm() {
+      this.$refs.taskForm.validate((valid) => {
+        if (valid) {
+          this.checkBtn();
+        }
+      });
+    },
+
+    allClick() {
+      if (!this.checkIds.length) {
+        return this.$message.error('请选择待审核数据');
+      }
+      this.singleFlag = false;
+      this.reviewDialog = true;
+    },
+    // 快捷审核
+    quickAuditClick() {
+      this.$router.push({
+        path: '/serviceManagement/quickReview/index'
+      });
+    },
+    async checkBtn() {
+      let nodeId = '';
+      const roles = this.userInfo.roles;
+
+      switch (true) {
+        // 43	地市管理员
+        case roles.includes(43):
+          nodeId = 2;
+          break;
+        // 4	区域管理员
+        case roles.includes(4):
+          nodeId = 3;
+          break;
+        // 42	市场管理员
+        case roles.includes(42):
+          nodeId = 8;
+          break;
+        // 40	商务管理员
+        case roles.includes(40):
+          nodeId = 9;
+          break;
+        // 39	事业部总经理
+        case roles.includes(39):
+          nodeId = 6;
+          break;
+        // 41	事业部分管领导
+        case roles.includes(41):
+          nodeId = 5;
+          break;
+        default:
+          nodeId = 1;
+      }
+
+      let res;
+      // 单条审核
+      if (this.singleFlag) {
+        let obj = {
+          token: this.reviewToken,
+          taskId: this.currentTaskId,
+          checkResult: this.taskForm.checkResult,
+          checkMessage: this.taskForm.checkMessage,
+          nodeId: nodeId
+        };
+        res = await checkSingleApi(obj);
+        if (res.data.code === 0 && res.data.data) {
+          this.$message.success('审核成功!');
+          this.getList();
+          this.handleClose();
+        }
+      }
     }
   }
 };
@@ -437,4 +543,17 @@ export default {
   border-bottom: 1px solid #d7d6d5;
   margin: 0 0 10px 0;
 }
+.check-btns {
+  width: 150px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.check-tips {
+  margin-bottom: 5px;
+  font-size: 16px;
+  color: rgb(233 77 77);
+  text-align: center;
+  font-weight: 600;
+}
 </style>