4
0
فهرست منبع

版本界面区分(新时代

shihang 6 سال پیش
والد
کامیت
f06a1341cb

+ 31 - 3
src/dashoo.cn/backend/api/controllers/biobank/samplessource.go

@@ -747,10 +747,10 @@ func (this *SamplesSourceController) InnerNoMakeSure() {
 	this.ServeJSON()
 }
 
-// @Title 新增动物来源基本信息
+// @Title 新增蜜蜂所来源基本信息
 // @Success	200	{object}
-// @router /saveanimal [post]
-func (this *SamplesSourceController) SaveAnimal() {
+// @router /savebee [post]
+func (this *SamplesSourceController) SaveBee() {
 	var model samplessource.AnimalInfo
 	var jsonblob = this.Ctx.Input.RequestBody
 	json.Unmarshal(jsonblob, &model)
@@ -811,6 +811,34 @@ func (this *SamplesSourceController) SaveAnimal() {
 	}
 }
 
+// @Title 新增动物来源基本信息
+// @Success	200	{object}
+// @router /saveanimal [post]
+func (this *SamplesSourceController) SaveAnimal() {
+	var model samplessource.AnimalInfo
+	var jsonblob = this.Ctx.Input.RequestBody
+	json.Unmarshal(jsonblob, &model)
+	model.AccCode = this.User.AccCode
+	model.CreateBy = this.User.Realname
+	model.CreateUserId, _ = utils.StrTo(this.User.Id).Int()
+	svc := samplessource.GetSamplesSourceService(utils.DBE)
+	_, err := svc.InsertEntityBytbl(this.User.AccCode+AnimaltbName, &model)
+
+	var errinfo ErrorDataInfo
+	if err == nil {
+		errinfo.Message = "操作成功!"
+		errinfo.Code = 0
+		errinfo.Item = model.Id
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	} else {
+		errinfo.Message = "操作失败!" + utils.AlertProcess(err.Error())
+		errinfo.Code = -1
+		this.Data["json"] = &errinfo
+		this.ServeJSON()
+	}
+}
+
 // @Title 获取动物样本源基本信息
 // @Description get user by token
 // @Success 200 {object} models.Userblood

+ 1 - 1
src/dashoo.cn/frontend_animal/src/pages/biobank/source/_opera/operationb.vue

@@ -440,7 +440,7 @@
             let jsonobj = JSON.parse(jsonstr)
             // 拼接两个对象
             params = Object.assign(params, jsonobj)
-            _this.$axios.post('/samplessource/saveanimal', params)
+            _this.$axios.post('/samplessource/savebee', params)
               .then(res => {
                 if (res.data.code === 0) {
                   _this.$message({

+ 4 - 3
src/dashoo.cn/frontend_animal/src/pages/biobank/source/_opera/sourcedetail.vue

@@ -38,13 +38,13 @@
               <label>样本名称 : {{ animalForm.Name }}</label>
             </el-col>
             <el-col :span="6">
-              <label>种属 : {{ animalForm.Genus }}</label>
+              <label>蜂种名称 : {{ animalForm.Genus }}</label>
             </el-col>
             <el-col :span="6">
-              <label>内部编号 : {{ animalForm.InnerNo }}</label>
+              <label>来源内码 : {{ animalForm.InnerNo }}</label>
             </el-col>
             <el-col :span="6">
-              <label>样本来源 : {{ animalForm.SourceType }}</label>
+              <label>项目属性 : {{ animalForm.ProjectName }}</label>
             </el-col>
             <el-col :span="6">
               <label>数量 : {{ animalForm.Amount }} {{ animalForm.Unit }} </label>
@@ -197,6 +197,7 @@
           Latitude: '',
           Altitude: '',
           SurveyDate: new Date(),
+          ProjectName: '',
           Remark: '',
         },
         SurveyDate: '',

+ 40 - 50
src/dashoo.cn/frontend_animal/src/pages/report/equipment.vue

@@ -10,7 +10,8 @@
           <el-breadcrumb-item>容器统计</el-breadcrumb-item>
         </el-breadcrumb>
         <span style="float: right;">
-          <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" @click="initData(1)">导出</el-button>
+          <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" @click="exportExcel()">导出
+          </el-button>
         </span>
         <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
           <el-form-item label="容器名称">
@@ -28,24 +29,17 @@
       </div>
 
       <el-table :data="list" bordertooltip-effect="dark" border height="calc(100vh - 230px)" style="width: 100%;">
-        <el-table-column label="容器名称" align="center" prop="Name"></el-table-column>
-        <el-table-column prop="Brand" align="center" label="容器品牌"></el-table-column>
-        <el-table-column prop="ModelVersion" align="center" label="容器型号"></el-table-column>
-        <el-table-column prop="RowNum" align="center" label="层数"></el-table-column>
-        <el-table-column prop="ColumnNum" align="center" label="列数"></el-table-column>
-        <el-table-column prop="Width" align="center" label="宽度"></el-table-column>
-        <el-table-column prop="Depth" align="center" label="深度"></el-table-column>
-        <el-table-column prop="Height" align="center" label="高度"></el-table-column>
-        <el-table-column prop="ProduceDate" sortable label="生产日期" align="center" width="130">
-          <template slot-scope="scope">
-            {{ jstimehandle(scope.row.ProduceDate)}}
-          </template>
-        </el-table-column>
-        <el-table-column prop="ValidityDate" sortable label="有效日期" align="center" width="130">
-          <template slot-scope="scope">
-            {{ jstimehandle(scope.row.ValidityDate)}}
-          </template>
-        </el-table-column>
+        <el-table-column prop="Equipment.Name" label="容器名称" align="center" min-width="90"></el-table-column>
+        <el-table-column prop="Equipment.Brand" align="center" label="容器品牌" min-width="80"></el-table-column>
+        <el-table-column prop="Equipment.ModelVersion" align="center" label="容器型号" min-width="160"></el-table-column>
+        <el-table-column prop="Equipment.RowNum" align="center" label="层数"></el-table-column>
+        <el-table-column prop="Equipment.ColumnNum" align="center" label="列数"></el-table-column>
+        <el-table-column prop="Equipment.Width" align="center" label="宽度"></el-table-column>
+        <el-table-column prop="Equipment.Depth" align="center" label="深度"></el-table-column>
+        <el-table-column prop="Equipment.Height" align="center" label="高度"></el-table-column>
+        <el-table-column prop="ShelfCount" align="center" label="冻存架数量"></el-table-column>
+        <el-table-column prop="BoxCount" align="center" label="冻存盒数量"></el-table-column>
+        <el-table-column prop="SampleCount" align="center" label="样本数量"></el-table-column>
       </el-table>
     </el-card>
   </div>
@@ -60,12 +54,13 @@
         searchform: {
           name: ''
         },
-        list: []
+        list: [],
+        filehost: ''
       }
     },
     created() {
-      // initial data
       this.initData(0)
+      this.filehost = process.env.imgserverhost
     },
     methods: {
       initData(val) {
@@ -73,43 +68,38 @@
         let params = {
           Name: _this.searchform.name
         }
-        // request
-        this.$axios.get('equipment/equipalllist', {
+        this.$axios.get('equipment/list', {
             params
           })
           .then(res => {
-            // response
-            if (val === 0) {
-              _this.list = res.data.items
-            } else {
-              if (res.data.code === 0) {
-                this.$message({
-                  type: 'success',
-                  message: '操作成功!'
-                })
-              }
-              window.location.href = 'http://' + res.data.message
-            }
-            // toggle loading
-            // _this.loading = false
-            // _this.currentItemCount = res.data.currentItemCount
+            _this.list = res.data.items
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
-      jstimehandle(val) {
-        if (val === '') {
-          return '----'
-        } else if (val === '0001-01-01T08:00:00+08:00') {
-          return '----'
-        } else if (val === '5000-01-01T23:59:59+08:00') {
-          return '永久'
-        } else {
-          val = val.replace('T', ' ')
-          return val.substring(0, 10)
-        }
+      exportExcel() {
+        let _this = this
+        _this.$confirm("此操作将导出所有数据, 是否继续?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: 'info'
+        }).then(() => {
+          _this.exportloading = true
+          _this.$axios.get('/equipment/exportexcel', {})
+            .then(res => {
+              _this.exportloading = false
+              window.location = this.filehost + res.data
+            })
+            .catch(err => {
+              _this.$message({
+                type: 'warning',
+                message: '导出数据出错,请重新操作!'
+              })
+              _this.exportloading = false
+              console.error(err)
+            })
+        }).catch(() => {})
       },
       searchCommand(command) {
         if (command == 'search') {

+ 2 - 2
src/dashoo.cn/frontend_web/nuxt.config.js

@@ -175,8 +175,8 @@ module.exports = {
   env: {
     appclient: 'biobank', //因顿LIMS:lims,样本库:biobank,细胞制备:cellbank,样本搜索判断,登录跳转判断
 
-    imgserverhost: 'http://localhost:9081', // BioBank服务地址,图片上传文件
-    //imgserverhost: 'http://47.92.238.200:9081', // BioBank服务地址,图片上传文件
+    //imgserverhost: 'http://localhost:9081', // BioBank服务地址,图片上传文件
+    imgserverhost: 'http://47.92.238.200:9081', // BioBank服务地址,图片上传文件
     upfilehost: 'http://weed1.labsop.cn:9333/dir/assign', // 附件上传
 
     //imgserverhost: 'http://188.188.30.89:9081', // 临沂服务地址,图片上传文件

+ 341 - 32
src/dashoo.cn/frontend_web/src/pages/biobank/source/_opera/operationb.vue

@@ -2,9 +2,11 @@
   .input-with-select .el-select .el-input {
     width: 110px;
   }
+
   .input-with-select .el-input-group__append {
     background-color: #fff;
   }
+
 </style>
 
 <template>
@@ -20,8 +22,16 @@
           <el-breadcrumb-item>{{pagetitle}}</el-breadcrumb-item>
         </el-breadcrumb>
         <span style="float: right;">
+
+          <!--审核模块 暂未进行任何修改版本-->
+          <!-- <el-button type="primary" size="mini" style="margin-left:10px; margin-top: -4px;" @click="auditorshow"
+            v-if="permissions[permissionscode.srapprove] && service_flag == 'editsource'"
+            :disabled="samplesForm.AuditorStatus != 0 || !author_flag">审核</el-button> -->
+          <!--审核模块结束-->
+
           <el-button type="primary" style="margin-left: 8px" class="el-button--mini" @click="savedata">保存</el-button>
-          <el-button size="mini" type="primary" class="el-button--small" style="margin-left: 8px" onclick="window.history.go(-1)">返回</el-button>
+          <el-button size="mini" type="primary" class="el-button--small" style="margin-left: 8px"
+            onclick="window.history.go(-1)">返回</el-button>
         </span>
       </div>
       <el-form :model="samplesForm" :rules="samplesrules" label-width="130px" style="min-height: calc(100vh - 189px)"
@@ -31,23 +41,23 @@
             <legend style="color:#436EEE"></legend>
             <i class="icon icon-paragraph-justify">基本信息</i>
           </div>
-          <el-row :gutter="20" class="customordetailcss">
+          <el-row :gutter="20">
             <el-col :span="8">
-              <el-form-item label="样本名称" prop="Name">
-                <el-input v-model="samplesForm.Name" placeholder="请输入样本名称"></el-input>
+              <el-form-item label="样本名称" prop="Name">
+                <el-input v-model="samplesForm.Name" placeholder="请输入样本名称" style="width: 100%"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="种属" prop="Genus">
-                <el-select ref="reftube" v-model="samplesForm.Genus" placeholder="请选择种属" style="width:100%">
+                <el-select ref="reftube" v-model="samplesForm.Genus" placeholder="请选择种属" style="width:100%" filterable>
                   <el-option v-for="item in genuslist" :label="item.Value" :value="item.Value" :key="item.Key">
                   </el-option>
                 </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="来源码" prop="InnerNo">
-                <el-input v-model="samplesForm.InnerNo" placeholder="请输入内部编号"></el-input>
+              <el-form-item label="来源码" prop="InnerNo">
+                <el-input v-model="samplesForm.InnerNo" placeholder="请输入来源内码" style="width: 100%"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -59,18 +69,71 @@
               </el-form-item>
             </el-col>
             <el-col :span="8">
-              <el-form-item label="数量">
+              <el-form-item label="数量" prop="Amount">
                 <el-input v-model="samplesForm.Amount" placeholder="请输入数量" style="width:100%"></el-input>
               </el-form-item>
             </el-col>
             <el-col :span="8">
               <el-form-item label="单位">
-                <el-select ref="refee" v-model="samplesForm.Unit" clearable style="width:100%" placeholder="请选择单位">
+                <el-select ref="refUnit" v-model="samplesForm.Unit" clearable style="width:100%" placeholder="请选择单位">
                   <el-option v-for="item in sampeunitlist" :label="item.Value" :value="item.Value" :key="item.Value">
                   </el-option>
                 </el-select>
               </el-form-item>
             </el-col>
+            <el-col :span="16">
+              <el-form-item label="取样地区" prop="Province">
+                <el-row>
+                  <el-col :span="10">
+                    <el-cascader :options="countryoptions" :props="countryprops" maxlength="20" placeholder="省市区"
+                      v-model="CityAry" style="width: 100%" @change="handleAreaChange" filterable>
+                    </el-cascader>
+                  </el-col>
+                  <el-col :span="14">
+                    <el-input v-model="samplesForm.Address" maxlength="500" placeholder="详细地址" style="width: 100%">
+                    </el-input>
+                  </el-col>
+                </el-row>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="区号">
+                <el-input v-model="samplesForm.AreaCode" placeholder="请输入区号" style="width: 100%"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="经度">
+                <el-input v-model="samplesForm.Longitude" placeholder="请输入经度" style="width: 100%"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="纬度">
+                <el-input v-model="samplesForm.Latitude" placeholder="请输入纬度" style="width: 100%"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="海拔">
+                <el-input v-model="samplesForm.Altitude" placeholder="请输入海拔" style="width: 85%"></el-input>
+                <span style="margin-left:15px">米</span>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="采样日期" prop="SurveyDate">
+                <el-date-picker v-model="samplesForm.SurveyDate" type="date" style="width:100%" placeholder="选择日期">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="8">
+              <el-form-item label="项目属性">
+                <el-select ref="refProject" v-model="samplesForm.ProjectName" clearable style="width:100%"
+                  placeholder="请选择项目属性">
+                  <el-option v-for="item in projectlist" :label="item.Value" :value="item.Value" :key="item.Value">
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col> -->
             <el-col :span="24">
               <el-form-item label="备注信息">
                 <el-input v-model="samplesForm.Remark" type="textarea" :rows=3 placeholder="请输入备注信息"></el-input>
@@ -93,19 +156,21 @@
                       <el-input v-model="item.FieldDefault" v-if="item.FieldType === '1'" :placeholder="'请输入'+item.Name"
                         auto-complete="off"></el-input>
 
-                      <el-select v-model="item.FieldDefault" v-if="item.FieldType === '2'" clearable :placeholder="'请选择'+item.Name"
-                        style="width:100%">
-                        <el-option :label="v" :value="v" :key="v" v-for=" v in item.FieldContent.split(',')"></el-option>
+                      <el-select v-model="item.FieldDefault" v-if="item.FieldType === '2'" clearable
+                        :placeholder="'请选择'+item.Name" style="width:100%">
+                        <el-option :label="v" :value="v" :key="v" v-for=" v in item.FieldContent.split(',')">
+                        </el-option>
                       </el-select>
 
                       <el-input v-model="item.FieldDefault" v-if="item.FieldType === '3'" :placeholder="'请输入'+item.Name"
                         type="textarea" :rows=3 auto-complete="off"></el-input>
 
-                      <el-date-picker v-model="item.FieldDefault" v-if="item.FieldType === '4'" type="datetime" style="width:100%"
-                        placeholder="请选择日期"></el-date-picker>
+                      <el-date-picker v-model="item.FieldDefault" v-if="item.FieldType === '4'" type="datetime"
+                        style="width:100%" placeholder="请选择日期"></el-date-picker>
 
-                      <el-button plain v-model="item.FieldDefault" v-if="item.FieldType === '5'" type="primary" size="mini"
-                        class="el-button--small" style="margin-left: 8px" @click="getitem(item)">上传图片</el-button>
+                      <el-button plain v-model="item.FieldDefault" v-if="item.FieldType === '5'" type="primary"
+                        size="mini" class="el-button--small" style="margin-left: 8px" @click="getitem(item)">上传图片
+                      </el-button>
                     </el-form-item>
                   </el-col>
                 </template>
@@ -116,9 +181,30 @@
         </el-tabs>
       </el-form>
     </el-card>
+
+
+    <!-- <el-dialog title="审核信息" :visible.sync="auditorShow" top="5vh">
+      <el-form :model="shenheForm" label-width="130px" ref="shenheForm">
+        <el-form-item label="审核状态">
+          <template>
+            <el-radio class="radio" v-model="shenheForm.SuccessStatus" :label="1">审核通过</el-radio>
+            <el-radio class="radio" v-model="shenheForm.SuccessStatus" :label="2">审核异常</el-radio>
+          </template>
+        </el-form-item>
+        <el-form-item label="审核说明">
+          <el-input type="textarea" v-model="shenheForm.AuditorRemark" placeholder="请输入审核说明"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer" style="margin-top: -25px">
+        <el-button size="small" @click="auditorShow = false">取 消</el-button>
+        <el-button type="primary" size="small" @click="auditor()">确 定</el-button>
+      </div>
+    </el-dialog> -->
+
     <el-dialog :title="ImageTitle" width="80%" :visible.sync="imageDialog">
-      <el-upload action="" :before-upload="beforeAvatarUpload" :on-preview="handlePictureCardPreview" :http-request="uploadrequest"
-        :on-success="handleAvatarSuccess" :on-remove="handleRemove" :file-list="imagefilelist" list-type="picture">
+      <el-upload action="" :before-upload="beforeAvatarUpload" :on-preview="handlePictureCardPreview"
+        :http-request="uploadrequest" :on-success="handleAvatarSuccess" :on-remove="handleRemove"
+        :file-list="imagefilelist" list-type="picture">
         <el-button size="small" type="primary">点击上传</el-button>
         <div slot="tip" class="el-upload__tip">只能上传jpg/png文件</div>
       </el-upload>
@@ -143,9 +229,26 @@
       }),
     },
     data() {
+      var checkAmount = (rule, value, callback) => {
+        if (!isNaN(parseInt(value)) && !isNaN(value) && value > 0) {
+          callback()
+        } else {
+          callback(new Error('请输入正确数字值!'))
+        }
+      }
       return {
         Tabs: '',
         pagetitle: '', //界面标题
+        dictData: null,
+        countryoptions: [],
+        countryListOptions: [],
+        countryprops: {
+          value: 'adcode',
+          label: 'name',
+          children: 'districts'
+        },
+        CityAry: [],
+
         samplesForm: {
           Id: '',
           AccCode: '',
@@ -156,27 +259,62 @@
           Unit: '', // 单位(容量)
           SourceType: '',
           Weight: '',
+          Province: '',
+          ProvinceName: '',
+          City: '',
+          CityName: '',
+          Street: '',
+          StreetName: '',
+          Address: '',
+          AreaCode: '',
+          Longitude: '',
+          Latitude: '',
+          Altitude: '',
+          SurveyDate: new Date(),
+          ProjectId: '',
+          ProjectName: '',
+          AuditorId: '',
+          AuditorName: '',
+          AuditorStatus: '',
+          AuditorRemark: '',
           Remark: '',
         },
+        //审核按钮可否点击
+        // auditorShow: false,
+        // shenheForm: {
+        //   SuccessStatus: 1,
+        //   AuditorRemark: ''
+        // },
+        // author_flag: false,
         extendForm: {},
         sampeunitlist: [],
         genuslist: [],
+        projectlist: [],
         samplesrules: {
           InnerNo: [{
             required: true,
-            message: '请输入内部编号',
+            message: '请输入来源内码',
             trigger: 'blur'
           }],
           Name: [{
             required: true,
-            message: '请输入名称',
+            message: '请输入样本源名称',
             trigger: 'blur'
           }],
           Genus: [{
             required: true,
-            message: '请输入种属',
+            message: '请输入蜂种名称',
+            trigger: 'blur'
+          }],
+          Amount: [{
+            validator: checkAmount,
             trigger: 'blur'
           }],
+          // Province: [{
+          //   required: true,
+          //   message: '请选择省市区',
+          //   trigger: 'change'
+          // }],
         },
         groupnameList: [],
         animalextends: [], // 扩展字段
@@ -190,6 +328,12 @@
         dialogVisible: false,
         ID: '',
         pid: 0,
+        permissionscode: {
+          srapprove: 'biobank.sourceAnimal.approve',
+        },
+        permissions: {
+          'biobank.sourceAnimal.approve': false,
+        },
       }
     },
     created() {
@@ -201,13 +345,31 @@
       } else if (this.pid != '0') {
         this.pagetitle = '编辑样本来源'
         this.service_flag = 'editsource'
-        //this.getanimalinfo()
       }
       _this.getGroupName()
       _this.getAnimalGenus()
       _this.getsampetypeunit()
+      _this.getProjectlist()
+      _this.getDictOptions()
+      _this.getPermissions()
+      _this.getAnimalInfo()
     },
     methods: {
+      getAnimalInfo(ServiceId) {
+        let _this = this
+        // request
+        _this.$axios.get('/samplessource/getanimalinfo/' + _this.ServiceId, {})
+          .then(res => {
+            _this.samplesForm = res.data.items
+            if (_this.authUser.Profile.Id != res.data.items.CreateUserId) {
+              _this.author_flag = true
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
       savedata() {
         if (this.pid == 'addsource' || this.pid <= '0') {
           this.trueInnerNo()
@@ -221,18 +383,19 @@
         _this.$axios.get("/samplessource/innernomakesure?InnerNo=" + this.samplesForm.InnerNo, {})
           .then(function (response) {
             let innerTotal = response.data.items
+            console.log("--------------------",response.data.items)
             if (innerTotal === 0) {
               _this.savebasic()
             } else {
               _this.$message({
                 type: 'warning',
-                message: '来源码重复!'
+                message: '来源码重复!'
               })
             }
           })
       },
       getanimalinfo() {
-        let _this = this // request
+        let _this = this
         let params = {
           Id: this.pid
         }
@@ -241,6 +404,11 @@
           })
           .then(res => {
             _this.samplesForm = res.data.items
+            _this.samplesForm.SurveyDate = new Date(res.data.items.SurveyDate)
+            _this.CityAry = []
+            _this.CityAry.push(_this.samplesForm.Province)
+            _this.CityAry.push(_this.samplesForm.City)
+            _this.CityAry.push(_this.samplesForm.Street)
             // 为扩展字段赋值
             for (var i = 0; i < _this.animalextends.length; i++) {
               if (_this.animalextends[i].FieldType == '4') {
@@ -257,7 +425,9 @@
         this.$refs["samplesForm"].validate((valid) => {
           if (valid) {
             let _this = this
-            _this.samplesForm.Unit = _this.$refs.refee.selectedLabel
+            _this.samplesForm.Amount = parseInt(_this.samplesForm.Amount)
+            _this.samplesForm.Unit = _this.$refs.refUnit.selectedLabel
+           // _this.samplesForm.ProjectName = _this.$refs.refProject.selectedLabel
             _this.samplesForm.SourceType = _this.$refs.refplace.selectedLabel
             let params = _this.samplesForm
             let jsonstr = ''
@@ -290,7 +460,6 @@
                 }
               })
               .catch(err => {
-                // handle error
                 console.error(err)
               })
           } else {
@@ -303,7 +472,10 @@
         this.$refs["samplesForm"].validate((valid) => {
           if (valid) {
             let _this = this
-            _this.samplesForm.Unit = _this.$refs.refee.selectedLabel
+            _this.samplesForm.Amount = parseInt(_this.samplesForm.Amount)
+            _this.samplesForm.Unit = _this.$refs.refUnit.selectedLabel
+          //  _this.samplesForm.ProjectName = _this.$refs.refProject.selectedLabel
+            _this.samplesForm.SourceType = _this.$refs.refplace.selectedLabel
             let params = _this.samplesForm
             let jsonstr = ''
             for (let i = 0; i < _this.animalextends.length; i++) {
@@ -317,7 +489,6 @@
             params = Object.assign(params, jsonobj)
             _this.$axios.put('/samplessource/editanimal/' + _this.pid, params)
               .then(res => {
-                // response
                 if (res.data.code === 0) {
                   _this.$message({
                     type: 'success',
@@ -334,7 +505,6 @@
                 }
               })
               .catch(err => {
-                // handle error
                 console.error(err)
               })
           } else {
@@ -343,6 +513,53 @@
           }
         })
       },
+      // 打开审核弹窗
+      // auditorshow() {
+      //   let _this = this
+      //   _this.auditorShow = true
+      // },
+      // auditor() {
+      //   let _this = this
+      //   _this.$confirm("确定审核该样本来源?审核后所有信息将不可修改!", "提示", {
+      //       confirmButtonText: "确定",
+      //       cancelButtonText: "取消",
+      //       type: "warning"
+      //     })
+      //     .then(() => {
+      //       if (_this.shenheForm.SuccessStatus == 1) {
+      //         _this.samplesForm.AuditorStatus = 1
+      //       } else {
+      //         _this.samplesForm.AuditorStatus = 2
+      //       }
+      //       _this.samplesForm.AuditorRemark = _this.shenheForm.AuditorRemark
+      //       _this.auditorShow = false
+      //       _this.saveauditor()
+      //     })
+      //     .catch(() => {})
+      // },
+      // saveauditor() {
+      //   let _this = this
+      //   _this.$axios.put('/samplessource/auditoranimal/' + _this.pid, _this.samplesForm)
+      //     .then(res => {
+      //       // response
+      //       if (res.data.code === 0) {
+      //         _this.$message({
+      //           type: 'success',
+      //           message: res.data.message
+      //         })
+      //         _this.getanimalinfo()
+      //       } else {
+      //         _this.$message({
+      //           type: 'warning',
+      //           message: res.data.message
+      //         })
+      //       }
+      //     })
+      //     .catch(err => {
+      //       // handle error
+      //       console.error(err)
+      //     })
+      // },
       // 获取样本单位
       getsampetypeunit() {
         let _this = this
@@ -359,6 +576,14 @@
             _this.genuslist = res.data
           })
       },
+      //获取项目属性
+      getProjectlist() {
+        let _this = this
+        _this.$axios.get('/items/worditem?code=ProjectName', {})
+          .then(res => {
+            _this.projectlist = res.data
+          })
+      },
       getGroupName() {
         this.$axios.get('extends/listbyloginwithgroup', {})
           .then(res => {
@@ -375,17 +600,79 @@
       getextends() {
         this.$axios.get('extends/listbylogin', {})
           .then(res => {
-            // response
             this.animalextends = res.data
-            if (this.pid > '0') {
+            if (this.pid > '1' && this.pid != 'addsource') {
               this.getanimalinfo()
             }
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
+      getDictOptions() {
+        let _this = this
+        _this.$axios.get('/sampletype/arealist', {})
+          .then(res => {
+            this.dictData = res.data.items;
+            if (this.dictData) {
+              this.getCityList(this.dictData['GaodeMapChinaAreas'])
+              //this.getCountryList(this.dictData['CountryList'])
+            }
+          })
+      },
+      getCityList(val) {
+        let resultData = JSON.parse(val)
+        let countstr = JSON.stringify(resultData.districts[0].districts)
+        countstr = countstr.replace(/\,\"districts\"\:\[\]/g, '')
+        this.countryoptions = JSON.parse(countstr)
+      },
+      // getCountryList(val) {
+      //   let tmpJson = JSON.parse(val)
+      //   this.countryListOptions = []
+      //   for (let idx in tmpJson) {
+      //     this.countryListOptions.push({
+      //       label: tmpJson[idx].split('-')[0],
+      //       value: tmpJson[idx].split('-')[1],
+      //       code: tmpJson[idx].split('-')[2],
+      //       key: tmpJson[idx]
+      //     })
+      //   }
+      // },
+      handleAreaChange(value) {
+        this.samplesForm.Province = value[0]
+        this.samplesForm.City = value[1]
+        this.samplesForm.Street = value[2]
+        for (var i = 0; i < this.countryoptions.length; i++) {
+          if (value[0] == this.countryoptions[i].adcode) {
+            this.samplesForm.ProvinceName = this.countryoptions[i].name
+
+            if (this.countryoptions[i].districts) {
+              for (var n = 0; n < this.countryoptions[i].districts.length; n++) {
+                if (value[1] == this.countryoptions[i].districts[n].adcode) {
+                  this.samplesForm.CityName = this.countryoptions[i].districts[n].name
+
+                  if (this.countryoptions[i].districts[n].districts) {
+                    for (var m = 0; m < this.countryoptions[i].districts[n].districts.length; m++) {
+                      if (value[2] == this.countryoptions[i].districts[n].districts[m].adcode) {
+                        this.samplesForm.StreetName = this.countryoptions[i].districts[n].districts[m].name
+                        this.samplesForm.AreaCode = (Array(4).join(0) + this.countryoptions[i].districts[n].districts[m]
+                          .citycode).slice(-4)
+                      }
+                    }
+                  } else {
+                    this.samplesForm.StreetName = this.countryoptions[i].districts[n].name
+                    this.samplesForm.AreaCode = (Array(4).join(0) + this.countryoptions[i].districts[n].citycode).slice(
+                      -4)
+                  }
+                }
+              }
+            } else {
+              this.samplesForm.StreetName = this.countryoptions[i].name
+              this.samplesForm.AreaCode = (Array(4).join(0) + this.countryoptions[i].citycode).slice(-4)
+            }
+          }
+        }
+      },
       //获取当前上传图片字段
       getitem(val) {
         this.imagefiles = ''
@@ -474,6 +761,28 @@
           }
         }
       },
+      //获取权限
+      getPermissions() {
+        let _this = this
+        // request
+        let params = {
+          percodes: `'${this.permissionscode.srapprove}'`
+        }
+        this.$axios.get('/permissions/isauths', {
+            params
+          })
+          .then(res => {
+            if (res.data instanceof Array && res.data.length > 0) {
+              res.data.forEach(element => {
+                _this.permissions[element.Code] = element.Isperm
+              });
+            }
+          })
+          .catch(err => {
+            // handle error
+            console.error(err)
+          })
+      },
     },
   }
 

+ 44 - 12
src/dashoo.cn/frontend_web/src/pages/biobank/source/_opera/sourcedetail.vue

@@ -2,9 +2,11 @@
   .input-with-select .el-select .el-input {
     width: 110px;
   }
+
   .input-with-select .el-input-group__append {
     background-color: #fff;
   }
+
 </style>
 
 <template>
@@ -20,7 +22,8 @@
           <el-breadcrumb-item>详细信息</el-breadcrumb-item>
         </el-breadcrumb>
         <span style="float: right;">
-          <el-button size="mini" type="primary" class="el-button--small" style="margin-left: 8px" @click="goback">返回</el-button>
+          <el-button size="mini" type="primary" class="el-button--small" style="margin-left: 8px" @click="goback">返回
+          </el-button>
         </span>
       </div>
 
@@ -38,16 +41,31 @@
               <label>种属 : {{ animalForm.Genus }}</label>
             </el-col>
             <el-col :span="6">
-              <label>内部编号 : {{ animalForm.InnerNo }}</label>
+              <label>来源内码 : {{ animalForm.InnerNo }}</label>
             </el-col>
             <el-col :span="6">
               <label>样本来源 : {{ animalForm.SourceType }}</label>
             </el-col>
             <el-col :span="6">
-              <label>数量 : {{ animalForm.Amount }} </label>
+              <label>数量 : {{ animalForm.Amount }} {{ animalForm.Unit }} </label>
+            </el-col>
+            <el-col :span="6">
+              <label>区号 :{{ animalForm.AreaCode }}</label>
+            </el-col>
+            <el-col :span="12">
+              <label>取样地址 :{{ Address }}</label>
+            </el-col>
+            <el-col :span="6">
+              <label>经度 :{{ animalForm.Longitude }}</label>
+            </el-col>
+            <el-col :span="6">
+              <label>纬度 :{{ animalForm.Latitude }}</label>
+            </el-col>
+            <el-col :span="6">
+              <label>海拔 :{{ animalForm.Altitude }} 米</label>
             </el-col>
             <el-col :span="6">
-              <label>单位 :{{ animalForm.Unit }}</label>
+              <label>调查时间 :{{ jstimehandle(SurveyDate) }}</label>
             </el-col>
             <el-col :span="24">
               <label>备注信息 :{{ animalForm.Remark }}</label>
@@ -56,7 +74,8 @@
         </div>
       </el-card>
 
-      <el-card class="box-card donorsdetailmaincard" v-for="groupname in groupnameList" :key="groupname" style="margin-top: 5px">
+      <el-card class="box-card donorsdetailmaincard" v-for="groupname in groupnameList" :key="groupname"
+        style="margin-top: 5px">
         <div slot="header">
           <i class="icon icon-paragraph-justify"> 扩展信息 / {{groupname}}</i>
         </div>
@@ -166,8 +185,22 @@
           Unit: '',
           SourceType: '',
           Weight: '',
-          Remark: ''
+          Province: '',
+          ProvinceName: '',
+          City: '',
+          CityName: '',
+          Street: '',
+          StreetName: '',
+          Address: '',
+          AreaCode: '',
+          Longitude: '',
+          Latitude: '',
+          Altitude: '',
+          SurveyDate: new Date(),
+          Remark: '',
         },
+        SurveyDate: '',
+        Address: '',
         groupnameList: [],
         animalextends: [], // 扩展字段
         sampletotal: {}, // 样本统计
@@ -201,6 +234,10 @@
           })
           .then(res => {
             _this.animalForm = res.data.items
+            _this.SurveyDate = res.data.items.SurveyDate
+            _this.animalForm.SurveyDate = new Date(res.data.items.SurveyDate)
+            _this.Address = res.data.items.ProvinceName + res.data.items.CityName + res.data.items.StreetName + res
+              .data.items.Address
             // 为扩展字段赋值
             for (var i = 0; i < _this.animalextends.length; i++) {
               if (_this.animalextends[i].FieldType == '4') {
@@ -210,7 +247,6 @@
               }
             }
           }).catch(err => {
-            // handle error
             console.error(err)
           })
       },
@@ -233,18 +269,15 @@
             this.initData()
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
       getsampletotal() {
         this.$axios.get('samplessource/getsampletotal/' + this.pid, {})
           .then(res => {
-            // response
             this.sampletotal = res.data
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
@@ -261,7 +294,6 @@
             this.currentItemCount = res.data.currentItemCount
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
@@ -291,7 +323,7 @@
           return '永久'
         } else {
           val = val.replace('T', ' ')
-          return val.substring(0, 19)
+          return val.substring(0, 10)
         }
       }
     }

+ 148 - 32
src/dashoo.cn/frontend_web/src/pages/biobank/source/animal.vue

@@ -15,11 +15,15 @@
           </router-link>
         </span>
         <el-form ref="form" :inline="true" style="float: right; margin-top: -10px">
-          <el-form-item label="样本名称">
-            <el-input size="mini" style="width: 165px;" v-model="searchform.Name" placeholder="请输入样本名称"></el-input>
+          <el-form-item label="样本名称">
+            <el-input size="mini" style="width: 165px;" v-model="searchform.Name" placeholder="请输入样本名称"></el-input>
           </el-form-item>
-          <el-form-item label="来源编码">
-            <el-input size="mini" style="width: 165px;" v-model="searchform.InnerNo" placeholder="请输入来源编码"></el-input>
+          <el-form-item label="来源内码">
+            <el-input size="mini" style="width: 165px;" v-model="searchform.InnerNo" placeholder="请输入来源内码"></el-input>
+          </el-form-item>
+          <el-form-item label="创建日期">
+            <el-date-picker size="mini" style="width: 220px" v-model="CreateOn" type="daterange" range-separator="至"
+              start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
           </el-form-item>
           <el-form-item>
             <el-dropdown split-button type="primary" size="mini" @click="seachdata" @command="searchCommand">
@@ -48,22 +52,38 @@
             </router-link>
           </template>
         </el-table-column>
-        <el-table-column prop="Name" sortable min-width="80" label="样本名称" align="center" show-overflow-tooltip>
+        <el-table-column prop="Name" sortable min-width="80" label="样本名称" align="center" show-overflow-tooltip>
         </el-table-column>
         <el-table-column prop="Genus" sortable min-width="80" label="种属" align="center" show-overflow-tooltip>
         </el-table-column>
-        <el-table-column prop="InnerNo" sortable align="center" label="内部编号" min-width="90" show-overflow-tooltip>
+        <el-table-column prop="InnerNo" sortable align="center" label="来源内码" min-width="120" show-overflow-tooltip>
+        </el-table-column>
+        <el-table-column prop="AddressLine" sortable align="center" label="取样地区" min-width="150" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <p>{{getaddress(scope.row)}}</p>
+          </template>
         </el-table-column>
         <el-table-column prop="Amount" sortable label="数量" align="center" show-overflow-tooltip min-width="60">
           <template slot-scope="scope">
             <p>{{scope.row.Amount}} {{scope.row.Unit}}</p>
           </template>
         </el-table-column>
-        <el-table-column prop="SourceType" sortable label="来源" align="center" show-overflow-tooltip min-width="60">
+        <!-- <el-table-column prop="AuditorStatus" sortable label="审核状态" align="center" min-width="80">
+          <template slot-scope="scope">
+            <el-tag v-show="scope.row.AuditorStatus=='0'" type="warning">未审核</el-tag>
+            <el-tag v-show="scope.row.AuditorStatus=='1'" type="success">审核成功</el-tag>
+            <el-tag v-show="scope.row.AuditorStatus=='2'" type="danger">审核失败</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="AuditorName" sortable label="审核人" align="center" show-overflow-tooltip></el-table-column> -->
+        <el-table-column prop="SurveyDate" sortable align="center" label="采样日期" min-width="80" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <p>{{jstimehandle(scope.row.SurveyDate)}}</p>
+          </template>
         </el-table-column>
       </el-table>
       <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
-        :page-sizes="[10, 15, 20, 25]" :page-size="size" layout="total, sizes, prev, pager, next, jumper"
+        :page-sizes="[10, 20, 50, 100]" :page-size="size" layout="total, sizes, prev, pager, next, jumper"
         :total="currentItemCount">
       </el-pagination>
     </el-card>
@@ -72,13 +92,13 @@
       <el-form ref="advancedSearchForm" label-width="90px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="来源编码">
-              <el-input size="mini" v-model="searchform.InnerNo" style="width:100%" placeholder="请输入来源编码"></el-input>
+            <el-form-item label="样本源名称">
+              <el-input size="mini" v-model="searchform.Name" style="width:100%" placeholder="请输入样本源名称"></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="样本名称">
-              <el-input size="mini" v-model="searchform.Name" style="width:100%" placeholder="请输入样本名称"></el-input>
+            <el-form-item label="来源内码">
+              <el-input size="mini" v-model="searchform.InnerNo" style="width:100%" placeholder="请输入来源内码"></el-input>
             </el-form-item>
           </el-col>
           <!-- <el-col :span="12">
@@ -90,15 +110,65 @@
             </el-form-item>
           </el-col> -->
           <el-col :span="12">
-            <el-form-item label="数量">
-              <el-input size="mini" v-model="searchform.Weight" style="width:100%" placeholder="请输入数量"></el-input>
+            <el-form-item label="种属">
+              <el-select ref="reftube" v-model="searchform.Genus" placeholder="请选择种属" style="width:100%" size="mini"
+                filterable>
+                <el-option v-for="item in genuslist" :label="item.Value" :value="item.Value" :key="item.Key">
+                </el-option>
+              </el-select>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="取样地区">
+              <el-input size="mini" v-model="searchform.Address" style="width:100%" placeholder="请输入取样地区"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="采样日期">
+              <el-date-picker size="mini" style="width: 240px" v-model="SurveyDate" type="daterange" range-separator="至"
+                start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="项目属性">
+              <el-select ref="refProject" v-model="searchform.ProjectName" size="mini" style="width: 240px"
+                placeholder="请选择项目属性">
+                <el-option v-for="item in projectlist" :label="item.Value" :value="item.Value" :key="item.Value">
+                  </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col> -->
           <el-col :span="12">
             <el-form-item label="样本来源">
-              <el-input size="mini" v-model="searchform.SourceType" style="width:100%" placeholder="请输入样本来源"></el-input>
+              <el-select ref="refplace" v-model="searchform.SourceType" size="mini" style="width: 240px"
+                placeholder="请选择样本来源">
+                <el-option label="收捕" value="收捕"></el-option>
+                <el-option label="购买" value="购买"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="审核状态">
+              <el-select ref="refplace" v-model="searchform.AuditorStatus" size="mini" style="width: 240px"
+                placeholder="请选择样本来源">
+                <el-option label="未审核" value="0"></el-option>
+                <el-option label="审核成功" value="1"></el-option>
+                <el-option label="审核失败" value="2"></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="审核人名称">
+              <el-input size="mini" v-model="searchform.AuditorName" style="width:100%" placeholder="请输入审核人名称">
+              </el-input>
+            </el-form-item>
+          </el-col> -->
+
+          <!-- <el-col :span="12">
+            <el-form-item label="数量">
+              <el-input size="mini" v-model="searchform.Amount" style="width:100%" placeholder="请输入数量(群)"></el-input>
+            </el-form-item>
+          </el-col> -->
         </el-row>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -127,15 +197,21 @@
         searchform: {
           GenusId: '',
           Genus: '',
+          Address: '',
           InnerNo: '',
           Name: '',
           Weight: '',
           SourceType: '',
+          ProjectName: '',
+          AuditorStatus: '',
+          AuditorName: '',
           Tive: '',
           remark: '',
           starttime: null,
           endtime: null,
         },
+        SurveyDate: [], // 采样日期
+        CreateOn: [new Date(new Date().getTime() - 3 * 30 * 24 * 60 * 60 * 1000), new Date()],
         currentItemCount: 0,
         currentPage: 1,
         size: 10,
@@ -148,26 +224,36 @@
         acceptUsers: [],
         userlist: [],
         genuslist: [],
-        permissionscode: {
-          contractadd: 'cellbank.contract.add',
-          contractedit: 'cellbank.contract.edit',
-          contractapprove: 'cellbank.contract.approve',
-        },
-        permissions: {
-          'cellbank.contract.add': false,
-          'cellbank.contract.edit': false,
-          'cellbank.contract.approve': false,
-        },
+        projectlist: [],
       }
     },
     created() {
       this.initdata()
       this.getAnimalGenus()
+      this.getProjectlist()
     },
     methods: {
       initdata() {
         let _this = this
-        // paginate
+        let SurveyDate = []
+        if (!_this.SurveyDate) {
+          _this.SurveyDate = []
+        }
+        if (_this.SurveyDate.length == 2) {
+          _this.SurveyDate[1].setHours(23)
+          _this.SurveyDate[1].setMinutes(59)
+          _this.SurveyDate[1].setSeconds(59)
+          SurveyDate.push(_this.formatDateTime(_this.SurveyDate[0]))
+          SurveyDate.push(_this.formatDateTime(_this.SurveyDate[1]))
+        }
+        let CreateOn = []
+        if (_this.CreateOn.length == 2) {
+          _this.CreateOn[1].setHours(23)
+          _this.CreateOn[1].setMinutes(59)
+          _this.CreateOn[1].setSeconds(59)
+          CreateOn.push(_this.formatDateTime(_this.CreateOn[0]))
+          CreateOn.push(_this.formatDateTime(_this.CreateOn[1]))
+        }
         const params = {
           _currentPage: this.currentPage,
           _size: this.size,
@@ -175,18 +261,22 @@
           Prop: this.Column.Prop
         }
         Object.assign(params, _this.searchform)
-        _this.$axios.get('/samplessource/animallist', {
-            params
-          })
+        _this.$axios.get('/samplessource/animallist?SurveyDate=' + SurveyDate.join(',') + '&CreateOn=' +
+            CreateOn.join(','), {
+              params
+            })
           .then(res => {
             _this.donorsList = res.data.items
             _this.currentItemCount = res.data.currentItemCount
           })
           .catch(err => {
-            // handle error
             console.error(err)
           })
       },
+      getaddress(val) {
+        let address = val.ProvinceName + val.CityName + val.StreetName + val.Address
+        return address
+      },
       getAnimalGenus() {
         // 获取种属
         let _this = this
@@ -195,6 +285,14 @@
             _this.genuslist = res.data
           })
       },
+      //获取项目属性
+      getProjectlist() {
+        let _this = this
+        _this.$axios.get('/items/worditem?code=ProjectName', {})
+          .then(res => {
+            _this.projectlist = res.data
+          })
+      },
       delSamplesSource(val) {
         let _this = this
         _this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
@@ -244,11 +342,17 @@
         }
       },
       clearSearch() {
+        this.searchform.GenusId = ''
         this.searchform.Genus = ''
-        this.searchform.Weight = ''
+        this.searchform.Address = ''
+        this.searchform.InnerNo = ''
         this.searchform.SourceType = ''
+        this.searchform.ProjectName = ''
         this.searchform.Name = ''
-        this.searchform.InnerNo = ''
+        this.searchform.AuditorStatus = ''
+        this.searchform.AuditorName = ''
+        this.SurveyDate = []
+        this.CreateOn = []
         this.initdata()
       },
       handleSizeChange(value) {
@@ -270,6 +374,18 @@
         var minute = date.getMinutes();
         minute = minute < 10 ? ('0' + minute) : minute;
         return y + '-' + m + '-' + d + ' ' + h + ':' + minute;
+      },
+      jstimehandle(val) {
+        if (val === '') {
+          return '----'
+        } else if (val === '0001-01-01T08:00:00+08:00') {
+          return '----'
+        } else if (val === '5000-01-01T23:59:59+08:00') {
+          return '永久'
+        } else {
+          val = val.replace('T', ' ')
+          return val.substring(0, 10)
+        }
       }
     }
   }