From 6df6cf36d90c8530d5d0631e1d9639267ecac7a4 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期二, 27 二月 2024 09:09:07 +0800
Subject: [PATCH] 新增模块
---
cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureItemParameterMapper.java | 19 ++
cnas-server/src/main/java/com/yuanchu/mom/service/impl/CapacityScopeServiceImpl.java | 86 ++++++++++
cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureTestObjectMapper.java | 21 ++
cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureTestObject.java | 52 ++++++
cnas-server/src/main/java/com/yuanchu/mom/service/CapacityScopeService.java | 35 ++++
cnas-server/src/main/java/com/yuanchu/mom/controller/CapacityScopeController.java | 85 ++++++++++
cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureItemParameter.java | 98 ++++++++++++
cnas-server/pom.xml | 2
cnas-server/src/main/resources/mapper/StructureItemParameterMapper.xml | 32 ++++
cnas-server/src/main/java/com/yuanchu/mom/dto/PageTestObjectDto.java | 21 ++
cnas-server/src/main/resources/mapper/StructureTestMapper.xml | 21 ++
11 files changed, 471 insertions(+), 1 deletions(-)
diff --git a/cnas-server/pom.xml b/cnas-server/pom.xml
index 7685e5e..0c8dcaf 100644
--- a/cnas-server/pom.xml
+++ b/cnas-server/pom.xml
@@ -10,7 +10,7 @@
<artifactId>cnas-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
- <name>user-server</name>
+ <name>cnas-server</name>
<description>cnas-server</description>
<packaging>jar</packaging>
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/controller/CapacityScopeController.java b/cnas-server/src/main/java/com/yuanchu/mom/controller/CapacityScopeController.java
new file mode 100644
index 0000000..7ab8351
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/controller/CapacityScopeController.java
@@ -0,0 +1,85 @@
+package com.yuanchu.mom.controller;
+
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PageTestObjectDto;
+import com.yuanchu.mom.pojo.StructureItemParameter;
+import com.yuanchu.mom.pojo.StructureTestObject;
+import com.yuanchu.mom.service.CapacityScopeService;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ帶鍒跺眰
+ *
+ * @author makejava
+ * @since 2024-02-26 16:21:17
+ */
+@Api(tags = "鑳藉姏鑼冨洿")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/capacityScope")
+public class CapacityScopeController {
+
+ private CapacityScopeService capacityScopeService;
+
+ @ApiOperation(value = "鑾峰彇椤圭洰妫�楠屽弬鏁板垪琛�")
+ @PostMapping("/selectItemParameterList")
+ public Result selectItemParameterList(@RequestBody Map<String, Object> data) throws Exception {
+ Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+ StructureItemParameter itemParameter = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), StructureItemParameter.class);
+ return Result.success(capacityScopeService.selectItemParameterList(page, itemParameter));
+ }
+
+ @ApiOperation(value = "娣诲姞椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/addItemParameter")
+ public Result addItemParameterList(@RequestBody StructureItemParameter itemParameter) {
+ return Result.success(capacityScopeService.addItemParameter(itemParameter));
+ }
+
+ @ApiOperation(value = "鍒犻櫎椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/delItemParameter")
+ public Result<?> delItemParameter(Integer id) {
+ return Result.success(capacityScopeService.delItemParameter(id));
+ }
+
+ @ApiOperation(value = "淇敼椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/upItemParameter")
+ public Result<?> upItemParameter(@RequestBody StructureItemParameter itemParameter) {
+ return Result.success(capacityScopeService.upItemParameter(itemParameter));
+ }
+
+ @ApiOperation(value = "鑾峰彇椤圭洰妫�楠屽弬鏁板垪琛�")
+ @PostMapping("/selectTestObjectList")
+ public Result selectTestObjectList(@RequestBody Map<String, Object> data) throws Exception {
+ Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
+ PageTestObjectDto pageTestObjectDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), PageTestObjectDto.class);
+ return Result.success(capacityScopeService.selectTestObjectList(page, pageTestObjectDto));
+ }
+
+ @ApiOperation(value = "娣诲姞椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/addTestObject")
+ public Result addTestObject(@RequestBody StructureTestObject testObject) {
+ return Result.success(capacityScopeService.addTestObject(testObject));
+ }
+
+ @ApiOperation(value = "鍒犻櫎椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/delTestObject")
+ public Result<?> delTestObject(Integer id) {
+ return Result.success(capacityScopeService.delTestObject(id));
+ }
+
+ @ApiOperation(value = "淇敼椤圭洰妫�楠屽弬鏁�")
+ @PostMapping("/upTestObject")
+ public Result upTestObject(@RequestBody StructureTestObject testObject) {
+ return Result.success(capacityScopeService.upTestObject(testObject));
+ }
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/dto/PageTestObjectDto.java b/cnas-server/src/main/java/com/yuanchu/mom/dto/PageTestObjectDto.java
new file mode 100644
index 0000000..2d00898
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/dto/PageTestObjectDto.java
@@ -0,0 +1,21 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.annotation.ValueTableShow;
+import com.yuanchu.mom.pojo.StructureTestObject;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author 鎴村崜
+ * @Date 2024/2/26
+ */
+@Data
+public class PageTestObjectDto extends StructureTestObject {
+ @ValueTableShow(2)
+ @ApiModelProperty(value = "鍒涘缓浜�")
+ private Integer createUserName;
+
+ @ValueTableShow(4)
+ @ApiModelProperty(value = "鏇存柊浜�")
+ private Integer updateUserName;
+}
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureItemParameterMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureItemParameterMapper.java
new file mode 100644
index 0000000..890714f
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureItemParameterMapper.java
@@ -0,0 +1,19 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.pojo.StructureItemParameter;
+
+/**
+ * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-02-26 16:21:17
+ */
+public interface StructureItemParameterMapper extends BaseMapper<StructureItemParameter> {
+
+ IPage<StructureItemParameter> selectItemParameterList(Page page, QueryWrapper<StructureItemParameter> ew);
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureTestObjectMapper.java b/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureTestObjectMapper.java
new file mode 100644
index 0000000..964ab53
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/mapper/StructureTestObjectMapper.java
@@ -0,0 +1,21 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PageTestObjectDto;
+import com.yuanchu.mom.pojo.StructureItemParameter;
+import com.yuanchu.mom.pojo.StructureTestObject;
+
+/**
+ * 妫�娴嬪璞�(StructureTestObject)琛ㄦ暟鎹簱璁块棶灞�
+ *
+ * @author makejava
+ * @since 2024-02-26 17:36:41
+ */
+public interface StructureTestObjectMapper extends BaseMapper<StructureTestObject> {
+
+ IPage<PageTestObjectDto> selectTestObjectList(Page page, QueryWrapper<PageTestObjectDto> ew);
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureItemParameter.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureItemParameter.java
new file mode 100644
index 0000000..6354d44
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureItemParameter.java
@@ -0,0 +1,98 @@
+package com.yuanchu.mom.pojo;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yuanchu.mom.annotation.ValueTableShow;
+import com.yuanchu.mom.common.OrderBy;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄥ璞�
+ *
+ * @author makejava
+ * @since 2024-02-26 16:21:17
+ */
+@TableName(value ="structure_item_parameter")
+@Data
+public class StructureItemParameter extends OrderBy implements Serializable {
+ @ApiModelProperty(value = "涓婚敭")
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ @ValueTableShow(1)
+ @ApiModelProperty(value = "妫�楠岄」")
+ private String inspectionItem;
+
+ @ValueTableShow(2)
+ @ApiModelProperty(value = "妫�楠岄」鍒嗙被")
+ private String inspectionItemClassify;
+
+ @ValueTableShow(3)
+ @ApiModelProperty(value = "妫�楠岄」灏忕被")
+ private String inspectionItemSubclass;
+
+ @ValueTableShow(4)
+ @ApiModelProperty(value = "瀹為獙瀹�")
+ private String laboratory;
+
+ @ValueTableShow(5)
+ @ApiModelProperty(value = "璁¢噺鍗曚綅")
+ private String unit;
+
+ @ValueTableShow(6)
+ @ApiModelProperty(value = "鍗曚环(鍏�)")
+ private Double price;
+
+ @ValueTableShow(7)
+ @ApiModelProperty(value = "宸ユ椂(H)")
+ private Integer manHour;
+
+ @ValueTableShow(8)
+ @ApiModelProperty(value = "宸ユ椂鍒嗙粍")
+ private String manHourGroup;
+
+ @ValueTableShow(9)
+ @ApiModelProperty(value = "妫�楠岄」绫诲瀷")
+ private String inspectionItemType;
+
+ @ValueTableShow(10)
+ @ApiModelProperty(value = "璁惧缁�")
+ private String deviceGroup;
+
+ @ValueTableShow(11)
+ @ApiModelProperty(value = "妫�楠屾鏁�")
+ private Integer checkoutNumber;
+
+ @ValueTableShow(12)
+ @ApiModelProperty(value = "鍖洪棿")
+ private String section;
+
+ @ValueTableShow(13)
+ @ApiModelProperty(value = "鍙栧�肩被鍨�")
+ private String valueType;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "淇敼浜篿d")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "淇敼鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureTestObject.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureTestObject.java
new file mode 100644
index 0000000..e5cbc2d
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/StructureTestObject.java
@@ -0,0 +1,52 @@
+package com.yuanchu.mom.pojo;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yuanchu.mom.annotation.ValueTableShow;
+import com.yuanchu.mom.common.OrderBy;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 妫�娴嬪璞�(StructureTestObject)琛ㄥ璞�
+ *
+ * @author makejava
+ * @since 2024-02-26 17:36:41
+ */
+@TableName(value ="structure_test_object")
+@Data
+public class StructureTestObject extends OrderBy implements Serializable {
+ @ApiModelProperty(value = "涓婚敭")
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ @ValueTableShow(1)
+ @ApiModelProperty(value = "鏍峰搧鍚嶇О")
+ private String specimenName;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "淇敼浜篿d")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ValueTableShow(3)
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ @ValueTableShow(5)
+ @ApiModelProperty(value = "鏇存柊鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/CapacityScopeService.java b/cnas-server/src/main/java/com/yuanchu/mom/service/CapacityScopeService.java
new file mode 100644
index 0000000..10872a9
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/CapacityScopeService.java
@@ -0,0 +1,35 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.PageTestObjectDto;
+import com.yuanchu.mom.pojo.StructureItemParameter;
+import com.yuanchu.mom.pojo.StructureTestObject;
+
+import java.util.Map;
+
+/**
+ * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ湇鍔℃帴鍙�
+ *
+ * @author makejava
+ * @since 2024-02-26 16:21:17
+ */
+public interface CapacityScopeService extends IService<StructureItemParameter> {
+
+ Map<String, Object> selectItemParameterList(Page page, StructureItemParameter itemParameter);
+
+ int addItemParameter(StructureItemParameter itemParameter);
+
+ int delItemParameter(Integer id);
+
+ int upItemParameter(StructureItemParameter itemParameter);
+
+ Map<String, Object> selectTestObjectList(Page page, PageTestObjectDto pageTestObjectDto);
+
+ int addTestObject(StructureTestObject testObject);
+
+ int delTestObject(Integer id);
+
+ int upTestObject(StructureTestObject testObject);
+}
+
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/service/impl/CapacityScopeServiceImpl.java b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/CapacityScopeServiceImpl.java
new file mode 100644
index 0000000..0965a15
--- /dev/null
+++ b/cnas-server/src/main/java/com/yuanchu/mom/service/impl/CapacityScopeServiceImpl.java
@@ -0,0 +1,86 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.common.PrintChina;
+import com.yuanchu.mom.dto.PageTestObjectDto;
+import com.yuanchu.mom.mapper.StructureItemParameterMapper;
+import com.yuanchu.mom.mapper.StructureTestObjectMapper;
+import com.yuanchu.mom.pojo.StructureItemParameter;
+import com.yuanchu.mom.pojo.StructureTestObject;
+import com.yuanchu.mom.service.CapacityScopeService;
+import com.yuanchu.mom.utils.QueryWrappers;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 妫�楠岄」鐩弬鏁�(StructureItemParameter)琛ㄦ湇鍔″疄鐜扮被
+ *
+ * @author makejava
+ * @since 2024-02-26 16:21:17
+ */
+@Service
+@AllArgsConstructor
+public class CapacityScopeServiceImpl extends ServiceImpl<StructureItemParameterMapper, StructureItemParameter> implements CapacityScopeService {
+
+ private GetLook getLook;
+
+ private StructureItemParameterMapper structureItemParameterMapper;
+
+ private StructureTestObjectMapper structureTestObjectMapper;
+
+ @Override
+ public Map<String, Object> selectItemParameterList(Page page, StructureItemParameter itemParameter) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("head", PrintChina.printChina(StructureItemParameter.class));
+ Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectItemParameterList");
+ if(map1.get("look")==1) itemParameter.setCreateUser(map1.get("userId"));
+ map.put("body", structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter)));
+ return map;
+ }
+
+ @Override
+ public int addItemParameter(StructureItemParameter itemParameter) {
+ return structureItemParameterMapper.insert(itemParameter);
+ }
+
+ @Override
+ public int delItemParameter(Integer id) {
+ return structureItemParameterMapper.deleteById(id);
+ }
+
+ @Override
+ public int upItemParameter(StructureItemParameter itemParameter) {
+ return structureItemParameterMapper.updateById(itemParameter);
+ }
+
+ @Override
+ public Map<String, Object> selectTestObjectList(Page page, PageTestObjectDto pageTestObjectDto) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("head", PrintChina.printChina(PageTestObjectDto.class));
+ Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectItemParameterList");
+ if(map1.get("look")==1) pageTestObjectDto.setCreateUser(map1.get("userId"));
+ map.put("body", structureTestObjectMapper.selectTestObjectList(page, QueryWrappers.queryWrappers(pageTestObjectDto)));
+ return map;
+ }
+
+ @Override
+ public int addTestObject(StructureTestObject testObject) {
+ return structureTestObjectMapper.insert(testObject);
+ }
+
+ @Override
+ public int delTestObject(Integer id) {
+ return structureTestObjectMapper.deleteById(id);
+ }
+
+ @Override
+ public int upTestObject(StructureTestObject testObject) {
+ return structureTestObjectMapper.updateById(testObject);
+ }
+}
+
diff --git a/cnas-server/src/main/resources/mapper/StructureItemParameterMapper.xml b/cnas-server/src/main/resources/mapper/StructureItemParameterMapper.xml
new file mode 100644
index 0000000..21247e6
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/StructureItemParameterMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.StructureItemParameterMapper">
+
+
+ <select id="selectItemParameterList" resultType="com.yuanchu.mom.pojo.StructureItemParameter">
+ select id,
+ inspection_item,
+ inspection_item_classify,
+ inspection_item_subclass,
+ laboratory,
+ unit,
+ price,
+ man_hour,
+ man_hour_group,
+ inspection_item_type,
+ device_group,
+ checkout_number,
+ section,
+ value_type,
+ create_user,
+ update_user,
+ create_time,
+ update_time
+ from structure_item_parameter
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-server/src/main/resources/mapper/StructureTestMapper.xml b/cnas-server/src/main/resources/mapper/StructureTestMapper.xml
new file mode 100644
index 0000000..46da112
--- /dev/null
+++ b/cnas-server/src/main/resources/mapper/StructureTestMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.StructureTestObjectMapper">
+
+ <select id="selectTestObjectList" resultType="com.yuanchu.mom.dto.PageTestObjectDto">
+ select sto.id,
+ sto.specimen_name,
+ u1.name createUserName,
+ sto.create_time,
+ u2.name updateUserName,
+ sto.update_time
+ from structure_test_object sto
+ left join user u1 on sto.create_user = u1.id
+ left join user u2 on sto.update_user = u2.id
+ <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+ ${ew.customSqlSegment}
+ </if>
+ </select>
+</mapper>
--
Gitblit v1.9.3