fjl
fujunling
2023-06-21 2d0fdaca6f7637c68782ae53ed2c3feee4f48db7
fjl
已修改6个文件
555 ■■■■■ 文件已修改
Source/UBCS-WEB/src/api/batchImport/index.js 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/BatchImport/ShowImportData.vue 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/BatchImport/index.vue 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/index.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/vue.config.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/batchImport/index.js
@@ -15,7 +15,8 @@
  return request({
    url: '/api/ubcs-code/mdmEngineController/downloadErrorFile',
    method: 'get',
    params
    params,
    responseType: 'blob'
  })
}
// 导入数据展示
@@ -25,4 +26,37 @@
    method: 'get',
    params: {redisOid: redisOid + "-class"}
  })
}
}
// 获取历史数据正确数据
export const getHistoryLeftTree = (redisOid) => {
  return request({
    url: '/api/ubcs-code/mdmEngineController/gridValidata',
    method: 'get',
    params: {redisOid: redisOid + "-ok"}
  })
}
// 获取历史相似项
export const getHistoryResembleTable = (params) => {
  return request({
    url: '/api/ubcs-code/mdmEngineController/gridResemble',
    method: 'get',
    params
  })
}
// 获取模板
export function getFormTemplate(params) {
  return request({
    url: 'api/ubcs-code/ubcs-code/mdmEngineController/getFormDefineByTemplateOid',
    method: 'get',
    params
  })
}
// 获取当前行相似项数据
export function getCurretnSelectedRowResemble(params) {
  return request({
    url: 'api/ubcs-code/ubcs-code/mdmEngineController/gridRowResemble',
    method: 'get',
    params
  })
}
Source/UBCS-WEB/src/components/BatchImport/ShowImportData.vue
@@ -1,9 +1,10 @@
<template>
  <el-dialog
    :title="title"
    :visible="dialogVisible"
    width="1200px"
    :visible.sync="dialogVisible"
    width="1300px"
    append-to-body
    top="5vh"
  >
    <div class="flex_box">
      <div class="left" :style="{ width: leftWidth }">
@@ -25,23 +26,90 @@
        <el-tree
          v-show="isExpand"
          class="filter_tree"
          :data="data"
          :data="leftTree"
          default-expand-all
          highlight-current
          :filter-node-method="filterNode"
          @node-click="treeNodeClick"
          ref="tree"
          :props="{
            label: 'name',
          }"
        >
        </el-tree>
      </div>
      <div class="right">
        <div class="tab_box">
          <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
            <el-tab-pane label="正确数据" name="success">
              <el-table border :data="successData"></el-table>
          <el-tabs
            v-model="activeTab"
            type="card"
            @tab-click="handleClick"
            size="small"
          >
            <el-tab-pane label="有相似项" name="resemble">
              <el-table
                border
                :data="resembleData"
                style="width: 100%"
                height="400px"
                highlight-current-row
                @current-change="resembleRowChange"
              >
                <el-table-column
                  v-for="item in cloNamesList"
                  :key="item.field"
                  :prop="item.field"
                  :label="item.title"
                  :width="item.width"
                >
                </el-table-column>
              </el-table>
            </el-tab-pane>
            <el-tab-pane label="有相似项或者错误数据" name="error">
              <el-table border :data="errorData"></el-table>
            <el-tab-pane label="正确数据" name="success">
              <el-table border :data="successData" height="400px">
                <el-table-column
                  v-for="item in cloNamesList"
                  :key="item.field"
                  :prop="item.field"
                  :label="item.title"
                  :width="item.width"
                >
                </el-table-column>
              </el-table>
            </el-tab-pane>
          </el-tabs>
        </div>
        <div>
          <el-table
            border
            :data="currentSelectedResemble"
            style="width: 100%"
            height="200px"
          >
            <el-table-column
              v-for="item in resembleColumList"
              :key="item.field"
              :prop="item.field"
              :label="item.title"
              :minWidth="item.minWidth"
            >
              <template #default="{ row }">
                <span v-if="item.field === 'id'">
                  <el-link type="primary" @click="openFormTemlpate(row)">{{
                    row[item.field]
                  }}</el-link>
                </span>
                <span v-else>
                  {{ row[item.field] }}
                </span>
              </template>
            </el-table-column>
            <el-table-column
              v-show="resembleColumList.length > 0"
              prop="rowIndex"
              label="excel行数"
            ></el-table-column>
          </el-table>
        </div>
      </div>
    </div>
@@ -51,18 +119,41 @@
        <el-button size="small">取消</el-button>
      </div>
    </template>
    <FormTemplateDialog
      ref="FormTemplateDialog"
      type="detail"
      v-bind="currentSelectedResembleRow"
      :visible.sync="currentSelectedResembleRow.visible"
      title="查看详细信息"
    ></FormTemplateDialog>
  </el-dialog>
</template>
<script>
import {
  getHistorySuccessTable,
  getHistoryResembleTable,
  getFormTemplate,
  getCurretnSelectedRowResemble,
} from "../../api/batchImport/index";
import ResembleQuery from "../FormTemplate/ResembleQuery.vue";
export default {
  name: "ShowImportData",
  components: { ResembleQuery },
  props: {
    title: {
      type: String,
      default: "历史数据导入",
    },
    visible: false,
    leftTree: {
      type: Array,
      default: () => [],
    },
    redisOid: {
      type: String,
      default: "",
    },
  },
  computed: {
    dialogVisible: {
@@ -193,15 +284,26 @@
          ],
        },
      ],
      resembleData: [],
      successData: [],
      errorData: [],
      activeTab: "resemble",
      cloNamesList: [],
      codeClassifyOid: "",
      resembleColumList: [],
      currentSelectedResemble: [],
      currentSelectedResembleRow: {
        templateOid: "",
        codeClassifyOid: "",
        rowOid: "",
        formTemplateVisible: false,
      },
    };
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
      return data.name.indexOf(value) !== -1;
    },
    hideTree() {
      if (this.isExpand) {
@@ -210,6 +312,276 @@
        this.leftWidth = "200px";
      }
      this.isExpand = !this.isExpand;
    },
    treeNodeClick(data) {
      this.codeClassifyOid = data.codeclassifyoid;
      this.cloNamesList = data.cloNamesList;
      getHistorySuccessTable(this.redisOid).then((res) => {
        this.successData = res.data
        // this.successData = [
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH007",
        //     caigouwl: "是",
        //     oid: "433DFA8E-4445-18F4-AC95-85E7EE1C92CF",
        //     kucunwl: "是",
        //     tuhao: "TH006",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试4",
        //     jiliangdw: "个",
        //     oldcode: "z0004",
        //     id: "0201020013",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH006",
        //     caigouwl: "是",
        //     oid: "E94E3320-841F-AE87-1D56-D6B3398D0FFC",
        //     kucunwl: "是",
        //     tuhao: "TH005",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试3",
        //     jiliangdw: "个",
        //     oldcode: "z0003",
        //     id: "0201020012",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH003",
        //     caigouwl: "是",
        //     oid: "D2E0A166-A774-BE6F-A9C7-3277467CE8EC",
        //     kucunwl: "是",
        //     tuhao: "TH003",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试2",
        //     jiliangdw: "个",
        //     oldcode: "z0002",
        //     id: "0201020011",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH002",
        //     caigouwl: "是",
        //     oid: "291CD01A-F18D-2D95-5291-D2C80ED57CC8",
        //     kucunwl: "是",
        //     tuhao: "TH002",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试1",
        //     jiliangdw: "个",
        //     oldcode: "z0001",
        //     id: "0201020010",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH001",
        //     caigouwl: "是",
        //     oid: "FED83315-F2B4-C603-2AC2-11B0DF3029A6",
        //     kucunwl: "是",
        //     tuhao: "TH001",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺栓",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试6",
        //     jiliangdw: "个",
        //     oldcode: "z0006",
        //     id: "0201010019",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH005",
        //     caigouwl: "是",
        //     oid: "3E120284-8EC2-9BF4-D1AB-579380DFA085",
        //     kucunwl: "是",
        //     tuhao: "TH005",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺栓",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试5",
        //     jiliangdw: "个",
        //     oldcode: "z0005",
        //     id: "0201010018",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH004",
        //     caigouwl: "是",
        //     oid: "2EB3B122-2FE4-A236-53F2-9B67E40332AC",
        //     kucunwl: "是",
        //     tuhao: "TH004",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺栓",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试4",
        //     jiliangdw: "个",
        //     oldcode: "z0004",
        //     id: "0201010017",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH009",
        //     caigouwl: "是",
        //     oid: "8940A341-8041-E031-6FE1-A18526C62DE9",
        //     kucunwl: "是",
        //     tuhao: "TH008",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试6",
        //     jiliangdw: "个",
        //     oldcode: "z0006",
        //     id: "0201020015",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH008",
        //     caigouwl: "是",
        //     oid: "936CBC1E-2FD0-5CD7-C331-64B86204FD78",
        //     kucunwl: "是",
        //     tuhao: "TH007",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试5",
        //     jiliangdw: "个",
        //     oldcode: "z0005",
        //     id: "0201020014",
        //   },
        // ];
      });
      getHistoryResembleTable({
        codeClassifyOid: data.codeClassifyOid,
        redisOid: this.redisOid + "-resemble",
      }).then((res) => {
        console.log(res);
        this.resembleData = res.data
        // this.resembleData = [
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH007",
        //     caigouwl: "是",
        //     oid: "FC2F0D9F-8B2E-5A19-3BDE-22107F373EB3",
        //     kucunwl: "是",
        //     tuhao: "TH006",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试4",
        //     jiliangdw: "个",
        //     oldcode: "z0004",
        //     id: "0201020013",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH007",
        //     caigouwl: "是",
        //     oid: "B92CFF46-1D46-E680-66C4-33A3ABE77A6C",
        //     kucunwl: "是",
        //     tuhao: "TH005",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试3",
        //     jiliangdw: "个",
        //     oldcode: "z0003",
        //     id: "0201020012",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH15",
        //     caigouwl: "是",
        //     oid: "B383C30E-D201-01F2-89EE-6F751EFA0AA1",
        //     kucunwl: "是",
        //     tuhao: "TH008",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试6",
        //     jiliangdw: "个",
        //     oldcode: "z0006",
        //     id: "0201020015",
        //   },
        //   {
        //     xiaoshouwl: "是",
        //     xinghaoguige: "XH17",
        //     caigouwl: "是",
        //     oid: "1C379116-F27B-3F20-DFC3-74A39B87E505",
        //     kucunwl: "是",
        //     tuhao: "TH007",
        //     codeSecLengthField: "6#4",
        //     codeclsfid: "紧固件#螺母",
        //     materialtype: "材料",
        //     chukufangshi: "先进先出",
        //     hesuanfenlei: "原材料",
        //     name: "测试5",
        //     jiliangdw: "个",
        //     oldcode: "z0005",
        //     id: "0201020014",
        //   },
        // ];
      });
      getFormTemplate({
        templateOid: data.oid,
        codeClassifyOid: data.codeClassifyOid,
      }).then((res) => {
        this.resembleColumList = res.data.resembleTableVO.cols[0];
      });
    },
    resembleRowChange(row) {
      getCurretnSelectedRowResemble({
        redisOid: this.redisOid + "-resemble-data",
        dataOid: row.oid,
      }).then((res) => {
        this.currentSelectedResemble = res.data
        // this.currentSelectedResemble = [
        //   {
        //     xinghaoguige: "XH007",
        //     codetemplateoid: "f441b131-5ea0-4672-ab74-735b11161928",
        //     rowIndex: "9",
        //     id: "0201020012",
        //     oid: "B92CFF46-1D46-E680-66C4-33A3ABE77A6C",
        //   },
        // ];
      });
    },
    openFormTemlpate(row) {
      this.currentSelectedResembleRow = {
        visible: true,
        templateOid: row.codetemplateoid,
        codeClassifyOid: this.codeClassifyOid,
        rowOid: row.rowOid,
      }
    },
  },
  watch: {
@@ -234,5 +606,10 @@
      overflow-y: scroll;
    }
  }
  .right {
    margin-left: 20px;
    margin-top: 30px;
    width: 1000px;
  }
}
</style>
Source/UBCS-WEB/src/components/BatchImport/index.vue
@@ -29,6 +29,7 @@
      :headers="uploadHeaders"
      :on-success="onSuccess"
      :show-file-list="false"
      :on-change="uploadChange"
      :data="{
        codeClassifyOid: this.codeClassifyOid,
        classifyAttr: this.classifyAttr,
@@ -46,9 +47,14 @@
        :loading="downloadLoading"
        >下载导入模板</el-button
      >
      <el-button size="small" @click="visible = false">关闭</el-button>
      <el-button size="small" @click="dialogVisible = false">关闭</el-button>
    </template>
    <ShowImportData :visible="showVisible" v-if="showVisible"></ShowImportData>
    <ShowImportData
      :visible.sync="showVisible"
      v-if="dialogVisible"
      :leftTree="leftTree"
      :redisOid="redisOid"
    ></ShowImportData>
  </el-dialog>
</template>
@@ -57,6 +63,7 @@
import {
  downloadHistoryImportTemplate,
  downloadErrorFile,
  getHistoryLeftTree
} from "../../api/batchImport/index";
import { getToken } from "@/util/auth";
export default {
@@ -86,6 +93,9 @@
      uploadParams: {},
      downloadLoading: false,
      showVisible: false,
      leftTree: [],
      redisOid:'',
      pageLoading: null
    };
  },
  computed: {
@@ -139,19 +149,47 @@
        codeClassifyOid: this.codeClassifyOid,
      })
        .then((res) => {
          this.downloadLoading = false;
          this.$utilFunc.downloadFileByBlob(res.data, "历史数据导入模板.xls");
          this.downloadLoading = false;
        })
        .catch(() => {
          this.downloadLoading = false;
        });
    },
    onSuccess(res) {
      if (res.code === 400) {
        this.$message.error(`${res.msg},请下载错误信息进行查看!`);
      let fileName = res.data.filePath.split('/').pop()
      if (res.data.fileOid) {
        this.$message.error("请下载错误信息文件进行查看!");
        downloadErrorFile({ uuid: res.data.fileOid }).then((res2) => {
          this.$utilFunc.downloadFileByBlob(res2.data, fileName);
        });
      }
      downloadErrorFile({ uuid: res.data.fileOid });
      if (res.data.redisUuid) {
        this.redisOid = res.data.redisUuid
        getHistoryLeftTree(res.data.redisUuid).then(res => {
          this.leftTree = res.obj.map(item => {
            return {
              ...item.codeClassifyTemplateVO,
              cloNamesList: item.cloNamesList
            }
          })
          this.showVisible = true
        })
      }
    },
    uploadChange(file) {
      if (file.status === 'ready') {
        this.pageLoading = this.$loading({
          lock: true,
          text: '文件上传中',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        });
      }
      if (file.status === 'success' || file.status === 'error') {
        this.pageLoading.close()
      }
    }
  },
  watch: {
    visible: {
Source/UBCS-WEB/src/components/Crud/VciMasterCrud.vue
@@ -28,7 +28,7 @@
          @submit="EditSumbit"
        ></FormTemplateDialog>
        <el-button plain size="small" type="primary">批量导入申请</el-button>
        <el-button plain size="small" type="primary">历史数据导入</el-button>
        <el-button plain size="small" type="primary" @click="historyVisible = true">历史数据导入</el-button>
        <el-button plain size="small" type="primary">批量申请编码</el-button>
        <el-button plain size="small" type="primary">批量发布</el-button>
        <el-button plain size="small" type="primary">查看流程历史</el-button>
@@ -111,6 +111,7 @@
        @current-change="handleCurrentChange">
      </el-pagination>
    </div>
    <historyImport :visible.sync="historyVisible" :codeClassifyOid="codeClassifyOid" type="historyImport"></historyImport>
  </basic-container>
</template>
<script>
@@ -119,11 +120,13 @@
import integrationTransfer from '@/views/integration/integrationTransfer'
import SetPersonnel from '@/components/template/SetPersonnel'
import ResembleQueryDialog from "@/components/FormTemplate/ResembleQueryDialog.vue";
import historyImport from '../BatchImport/index.vue'
export default {
  components: {
    integrationTransfer,
    SetPersonnel,
    ResembleQueryDialog
    ResembleQueryDialog,
    historyImport
  },
  name: "Crud.vue",
  props: {
@@ -208,7 +211,8 @@
      tableHeadData: [],
      items: {},
      seniorQueryColumns: [],
      selectRow: []
      selectRow: [],
      historyVisible: false
    }
  },
  computed: {},
Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -29,7 +29,7 @@
      "
    >
      <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
        <el-tab-pane label="码值申请" name="codeApply">
        <el-tab-pane label="码值申请" name="codeApply" v-if="showCodeApply">
          <FormTempalte
            v-bind="$attrs"
            :type="type"
@@ -57,18 +57,25 @@
        </el-tab-pane>
      </el-tabs>
    </div>
    <div class="avue-dialog__footer" v-if="type !== 'detail'">
      <el-button @click="close()">取 消</el-button>
      <el-button @click="submit()" type="primary" :loading="submitBtnLoading">{{
        submitText
      }}</el-button>
      <el-button
        @click="resembleQuerySubmit"
        type="primary"
        v-if="showResembleQuery"
        >相似像查询</el-button
      >
    </div>
    <template #footer>
      <div class="" v-if="type !== 'detail'">
        <el-button @click="close()" size="small">取 消</el-button>
        <el-button
          @click="submit()"
          type="primary"
          :loading="submitBtnLoading"
          size="small"
          >{{ submitText }}</el-button
        >
        <el-button
          @click="resembleQuerySubmit"
          type="primary"
          size="small"
          v-if="showResembleQuery"
          >相似像查询</el-button
        >
      </div>
    </template>
  </el-dialog>
</template>
@@ -236,6 +243,7 @@
    // 获取码值申请数据
    getCodeRule() {
      getCodeRule({ codeClassifyOid: this.codeClassifyOid }).then((res) => {
        console.log(res, "resresresresres");
        if (res.data && res.data.code === 200) {
          const typeList = [
            "codefixedsec",
@@ -244,8 +252,9 @@
            "coderefersec",
          ];
          this.secVOList = (res.data.data.secVOList || []).filter((item) =>
            typeList.includes(item)
            typeList.includes(item.secType)
          );
          console.log(this.secVOList, "this.secVOListthis.secVOList");
          this.$nextTick(() => {
            if (this.secVOList.length > 0 && this.type === "add") {
              this.showCodeApply = true;
@@ -301,19 +310,21 @@
        this.form
      );
      if (resembleQueryList.length === 0) {
        let resForm = {}
        const { defaultValue, formValue } = this.getDefaultValueAndFormValues(this.form)
        resForm.data = formValue
        resForm = Object.assign({}, resForm, defaultValue)
        resForm.secDTOList = []
        let resForm = {};
        const { defaultValue, formValue } = this.getDefaultValueAndFormValues(
          this.form
        );
        resForm.data = formValue;
        resForm = Object.assign({}, resForm, defaultValue);
        resForm.secDTOList = [];
        for (const key in this.codeApplyForm) {
        if (Object.hasOwnProperty.call(this.codeApplyForm, key)) {
          const value = this.codeApplyForm[key];
          if (value) {
            resForm.secDTOList.push({[key]: value})
          if (Object.hasOwnProperty.call(this.codeApplyForm, key)) {
            const value = this.codeApplyForm[key];
            if (value) {
              resForm.secDTOList.push({ [key]: value });
            }
          }
        }
      }
        this.$emit("submit", resForm);
      } else {
        this.$confirm(
Source/UBCS-WEB/vue.config.js
@@ -30,7 +30,6 @@
        // target: 'http://192.168.1.51:37000',
        // target: 'http://192.168.1.46:37000',
        // target: 'http://dev.vci-tech.com:37000',
        // target: 'http://192.168.1.51:37000/',
        // target: 'http://192.168.1.104:37000',
        // target: 'http://192.168.1.63:37000',
        //target: 'http://192.168.3.7:37000',